Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp909661imb; Fri, 1 Mar 2019 18:54:00 -0800 (PST) X-Google-Smtp-Source: AHgI3Ia6lDR83mSpR8n3dznVvmO5FCxfuXe30fwJQQI3fVXUNHVvvMfPwrEbYHYjBIBFsOH8jZPF X-Received: by 2002:a62:bd13:: with SMTP id a19mr8892829pff.222.1551495240149; 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=y7KEy6P21IbMcZ/uIHiLRiM1kqv4vzzf9jZJygqJRC5Bfa33pVb9zl3tY0Oh5v9Nxi 4U63tdelwUTFEpIQv8rotsQy4/FpIvxAh2hrtlEq4QZZjQChBMYJqTWKEZmlClv2jJjL PrFr456VEzBfxsucaxDivRVSOmxFvBP5C1lAkvgGNROQTDbnkVA2U+t89p0JP6mG/Qva s0z7Yhb/CA6hzDheXDzok7VTVoSv1THYf7BLDtmnqPExZTrWwWOiMb8AVgJqzjA7mACB SS9qtiNHEfvNdj/KUbK/531ef2q+iKoLCbg9Hk/USpViomcinYq0wFlCeJRvHfwiDJDR DpDw== 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=z6aXOgp7B7UGiaDApBCo4mQ/HuD2Uoj3XTdGbrJ4EdI=; b=p+TlhhVConKgexSjmbFp7+tWVr4nrCCh7UQ/u3sQ2yh0jdAtd4VY1nD/n+E/S+JKBM FsHim4LyDOmdnzLaH2QVDfdEISSdpXCyztvVSa2TZ2eUCUcUmRA3RzkVVJGSTwhmO0Nd mOgBBuu3RDc4rSUbpY9lO0Z1pVicx0+ENN5jbIlfKl85chN2RBHoGG6GY6qgFxRjDMrT YskdNRTE5uWlt3XFkcyzl0mR3+tQq+JFB6tFeZPoRrkMKAD1pa7ZLVyB7iO4JqraZ8bG 4DSMILeXQqKtq+wLFKVI4hDziVXBpeLLfsHM/M7WuQWnWsvjLUOwzPw+UhNZmmHoOS0K MO/A== 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 l11si22700390pgc.473.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 S1727935AbfCBCwf (ORCPT + 99 others); Fri, 1 Mar 2019 21:52:35 -0500 Received: from mga04.intel.com ([192.55.52.120]:49778 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727903AbfCBCwd (ORCPT ); Fri, 1 Mar 2019 21:52:33 -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="148572637" 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 17/17] kvm: vmx: Emulate TEST_CTL MSR Date: Fri, 1 Mar 2019 18:45:11 -0800 Message-Id: <1551494711-213533-18-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 A control bit (bit 29) in TEST_CTL MSR 0x33 will be introduced in future x86 processors. When bit 29 is set, the processor causes #AC exception for split locked accesses at all CPL. Please check the latest Intel Software Developer's Manual for more detailed information on the MSR and the split lock bit. 1. Since the kernel chooses to enable AC split lock by default, which means if we don't emulate TEST_CTL MSR for guest, guest will run with this feature enable while does not known it. Thus existing guests with buggy firmware (like OVMF) and old kernels having the cross cache line issues will fail the boot due to #AC. So we should emulate TEST_CTL MSR, and set it zero to disable AC split lock by default. Whether and when to enable it is left to guest firmware and guest kernel. 2. Host and guest can enable AC split lock independently, so using msr autoload to switch it during VM entry/exit. Signed-off-by: Xiaoyao Li Signed-off-by: Fenghua Yu --- arch/x86/kvm/vmx/vmx.c | 35 +++++++++++++++++++++++++++++++++++ arch/x86/kvm/vmx/vmx.h | 1 + 2 files changed, 36 insertions(+) diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 3e03c6e1e558..c0c5e8621afa 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -1659,6 +1659,12 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) u32 index; switch (msr_info->index) { + case MSR_TEST_CTL: + if (!msr_info->host_initiated && + !(vmx->core_capability & CORE_CAP_SPLIT_LOCK_DETECT)) + return 1; + msr_info->data = vmx->msr_test_ctl; + break; #ifdef CONFIG_X86_64 case MSR_FS_BASE: msr_info->data = vmcs_readl(GUEST_FS_BASE); @@ -1805,6 +1811,14 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) u32 index; switch (msr_index) { + case MSR_TEST_CTL: + if (!(vmx->core_capability & CORE_CAP_SPLIT_LOCK_DETECT)) + return 1; + + if (data & ~TEST_CTL_ENABLE_SPLIT_LOCK_DETECT) + return 1; + vmx->msr_test_ctl = data; + break; case MSR_EFER: ret = kvm_set_msr_common(vcpu, msr_info); break; @@ -4108,6 +4122,9 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx) vmx->arch_capabilities = kvm_get_arch_capabilities(); + /* disable AC split lock by default */ + vmx->msr_test_ctl = 0; + vm_exit_controls_init(vmx, vmx_vmexit_ctrl()); /* 22.2.1, 20.8.1 */ @@ -4145,6 +4162,7 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) vmx->rmode.vm86_active = 0; vmx->spec_ctrl = 0; + vmx->msr_test_ctl = 0; vcpu->arch.microcode_version = 0x100000000ULL; vmx->vcpu.arch.regs[VCPU_REGS_RDX] = get_rdx_init_val(); @@ -6344,6 +6362,21 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx) msrs[i].host, false); } +static void atomic_switch_msr_test_ctl(struct vcpu_vmx *vmx) +{ + u64 host_msr_test_ctl; + + if (!boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) + return; + + rdmsrl(MSR_TEST_CTL, host_msr_test_ctl); + if (host_msr_test_ctl == vmx->msr_test_ctl) + clear_atomic_switch_msr(vmx, MSR_TEST_CTL); + else + add_atomic_switch_msr(vmx, MSR_TEST_CTL, vmx->msr_test_ctl, + host_msr_test_ctl, false); +} + static void vmx_arm_hv_timer(struct vcpu_vmx *vmx, u32 val) { vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, val); @@ -6585,6 +6618,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) atomic_switch_perf_msrs(vmx); + atomic_switch_msr_test_ctl(vmx); + vmx_update_hv_timer(vcpu); /* diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index cc22379991f3..e8831609c6c3 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 msr_test_ctl; u64 core_capability; u64 arch_capabilities; u64 spec_ctrl; -- 2.7.4