Received: by 2002:a05:6a10:6006:0:0:0:0 with SMTP id w6csp1044814pxa; Fri, 28 Aug 2020 01:59:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyvC4AzjCnILfMKqewI7aF0uUygl2dUegfm3UCT2vTU4sbEAdB16wOPeSiM+O4AUTOc7OcQ X-Received: by 2002:a17:906:eb0c:: with SMTP id mb12mr754470ejb.48.1598605158341; Fri, 28 Aug 2020 01:59:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598605158; cv=none; d=google.com; s=arc-20160816; b=vX13NB4UtTsv4veuCL0EJN21zWKGpNKJ8By/KhQaU10i3jbvFgCj0+e48MmK6sUVk+ Cpk+ZwIaZPk9JvqNFsv+/fAr3BJoEd9f1CWEtzDi/2cajd04zHB2JtbSNFnUE7Sj2cFx EN0+0aw+o86ZiDUKMq8h5qAkeYZtiIXFgbylOjYAgmBwC3vQw2eOaWuF2mF+GqasYoVx PRhfJZc2ZTLyxq+8ZNIC+k6dEFdqK+WHp+uSHpocRmwlDyOLdNeOh5zK+Ge+5cI8mUfI 0KpNwGyhaj5/41ihXpSem13UnAezKTYMvWjWzot0Xj3+n3qcAOTGLXkDii55EKAu43iS anKg== 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:ironport-sdr:ironport-sdr; bh=6J09Q7MArcvrpPXpyeQD2LrSu6AOEaP1zF2uPxPM45I=; b=En3dBTlYdptapQJNbB0HGHRnsrK7hrGyebeowIepHZjHG7sFI5ftGsesnLzI5AWZgO lU2i6jyHXvI4DBG1rjq6nuHgKVarq01e5TmefMGdbKb48qeNKyHLN0sedDjqU0tW2xSF WYzFNxMuJ55b1x0hy2oqDdj6p7igjrHzuHgHjlCZYZ7SmVO8HU13WptqcgFF46cpyVua dl1i8Ventu6N8R5aE7WVD08bwa11qJMUba24ugnZ8oOK7p+sDYbuuQLqttjGqUBkm80B dLIpj/Xy4z+8116qd9wgs5MSJFLG6gsQHGt60572uBEHeTsaYNWpJypNlv6q2GGARRsC ohKw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id q2si179730edj.526.2020.08.28.01.58.55; Fri, 28 Aug 2020 01:59:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1728809AbgH1IzC (ORCPT + 99 others); Fri, 28 Aug 2020 04:55:02 -0400 Received: from mga17.intel.com ([192.55.52.151]:49191 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728751AbgH1IyV (ORCPT ); Fri, 28 Aug 2020 04:54:21 -0400 IronPort-SDR: XJjZ/IAD0YSSErSMaVHvXfuKY5L+Qrok7171A1nJvolnFX+Zk5KcdUpPf2NxJUrur13qtya8Ke Sp/zcK2dnLGw== X-IronPort-AV: E=McAfee;i="6000,8403,9726"; a="136697508" X-IronPort-AV: E=Sophos;i="5.76,363,1592895600"; d="scan'208";a="136697508" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Aug 2020 01:54:20 -0700 IronPort-SDR: dj1I0Fccu511nN12IEgtnl2d/YmRfCVGonFWeUxYx2KUfgzOAKNgFLoHUwDEt9PI+PdpctKBHX P0o9RQvJSvZA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,363,1592895600"; d="scan'208";a="332483501" Received: from chenyi-pc.sh.intel.com ([10.239.159.72]) by fmsmga002.fm.intel.com with ESMTP; 28 Aug 2020 01:54:17 -0700 From: Chenyi Qiang To: Paolo Bonzini , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Xiaoyao Li Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/5] KVM: nVMX: Verify the VMX controls MSRs with the global capability when setting VMX MSRs Date: Fri, 28 Aug 2020 16:56:19 +0800 Message-Id: <20200828085622.8365-3-chenyi.qiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200828085622.8365-1-chenyi.qiang@intel.com> References: <20200828085622.8365-1-chenyi.qiang@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When setting the nested VMX MSRs, verify it with the values in vmcs_config.nested_vmx_msrs, which reflects the global capability of VMX controls MSRs. Signed-off-by: Chenyi Qiang --- arch/x86/kvm/vmx/nested.c | 71 ++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 6e0e71f4d45f..47bee53e235a 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -1234,7 +1234,7 @@ static int vmx_restore_vmx_basic(struct vcpu_vmx *vmx, u64 data) BIT_ULL(49) | BIT_ULL(54) | BIT_ULL(55) | /* reserved */ BIT_ULL(31) | GENMASK_ULL(47, 45) | GENMASK_ULL(63, 56); - u64 vmx_basic = vmx->nested.msrs.basic; + u64 vmx_basic = vmcs_config.nested.basic; if (!is_bitwise_subset(vmx_basic, data, feature_and_reserved)) return -EINVAL; @@ -1265,24 +1265,24 @@ vmx_restore_control_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data) switch (msr_index) { case MSR_IA32_VMX_TRUE_PINBASED_CTLS: - lowp = &vmx->nested.msrs.pinbased_ctls_low; - highp = &vmx->nested.msrs.pinbased_ctls_high; + lowp = &vmcs_config.nested.pinbased_ctls_low; + highp = &vmcs_config.nested.pinbased_ctls_high; break; case MSR_IA32_VMX_TRUE_PROCBASED_CTLS: - lowp = &vmx->nested.msrs.procbased_ctls_low; - highp = &vmx->nested.msrs.procbased_ctls_high; + lowp = &vmcs_config.nested.procbased_ctls_low; + highp = &vmcs_config.nested.procbased_ctls_high; break; case MSR_IA32_VMX_TRUE_EXIT_CTLS: - lowp = &vmx->nested.msrs.exit_ctls_low; - highp = &vmx->nested.msrs.exit_ctls_high; + lowp = &vmcs_config.nested.exit_ctls_low; + highp = &vmcs_config.nested.exit_ctls_high; break; case MSR_IA32_VMX_TRUE_ENTRY_CTLS: - lowp = &vmx->nested.msrs.entry_ctls_low; - highp = &vmx->nested.msrs.entry_ctls_high; + lowp = &vmcs_config.nested.entry_ctls_low; + highp = &vmcs_config.nested.entry_ctls_high; break; case MSR_IA32_VMX_PROCBASED_CTLS2: - lowp = &vmx->nested.msrs.secondary_ctls_low; - highp = &vmx->nested.msrs.secondary_ctls_high; + lowp = &vmcs_config.nested.secondary_ctls_low; + highp = &vmcs_config.nested.secondary_ctls_high; break; default: BUG(); @@ -1298,8 +1298,30 @@ vmx_restore_control_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data) if (!is_bitwise_subset(supported, data, GENMASK_ULL(63, 32))) return -EINVAL; - *lowp = data; - *highp = data >> 32; + switch (msr_index) { + case MSR_IA32_VMX_TRUE_PINBASED_CTLS: + vmx->nested.msrs.pinbased_ctls_low = data; + vmx->nested.msrs.pinbased_ctls_high = data >> 32; + break; + case MSR_IA32_VMX_TRUE_PROCBASED_CTLS: + vmx->nested.msrs.procbased_ctls_low = data; + vmx->nested.msrs.procbased_ctls_high = data >> 32; + break; + case MSR_IA32_VMX_TRUE_EXIT_CTLS: + vmx->nested.msrs.exit_ctls_low = data; + vmx->nested.msrs.exit_ctls_high = data >> 32; + break; + case MSR_IA32_VMX_TRUE_ENTRY_CTLS: + vmx->nested.msrs.entry_ctls_low = data; + vmx->nested.msrs.entry_ctls_high = data >> 32; + break; + case MSR_IA32_VMX_PROCBASED_CTLS2: + vmx->nested.msrs.secondary_ctls_low = data; + vmx->nested.msrs.secondary_ctls_high = data >> 32; + break; + default: + BUG(); + } return 0; } @@ -1313,8 +1335,8 @@ static int vmx_restore_vmx_misc(struct vcpu_vmx *vmx, u64 data) GENMASK_ULL(13, 9) | BIT_ULL(31); u64 vmx_misc; - vmx_misc = vmx_control_msr(vmx->nested.msrs.misc_low, - vmx->nested.msrs.misc_high); + vmx_misc = vmx_control_msr(vmcs_config.nested.misc_low, + vmcs_config.nested.misc_high); if (!is_bitwise_subset(vmx_misc, data, feature_and_reserved_bits)) return -EINVAL; @@ -1344,8 +1366,8 @@ static int vmx_restore_vmx_ept_vpid_cap(struct vcpu_vmx *vmx, u64 data) { u64 vmx_ept_vpid_cap; - vmx_ept_vpid_cap = vmx_control_msr(vmx->nested.msrs.ept_caps, - vmx->nested.msrs.vpid_caps); + vmx_ept_vpid_cap = vmx_control_msr(vmcs_config.nested.ept_caps, + vmcs_config.nested.vpid_caps); /* Every bit is either reserved or a feature bit. */ if (!is_bitwise_subset(vmx_ept_vpid_cap, data, -1ULL)) @@ -1362,10 +1384,10 @@ static int vmx_restore_fixed0_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data) switch (msr_index) { case MSR_IA32_VMX_CR0_FIXED0: - msr = &vmx->nested.msrs.cr0_fixed0; + msr = &vmcs_config.nested.cr0_fixed0; break; case MSR_IA32_VMX_CR4_FIXED0: - msr = &vmx->nested.msrs.cr4_fixed0; + msr = &vmcs_config.nested.cr4_fixed0; break; default: BUG(); @@ -1378,7 +1400,16 @@ static int vmx_restore_fixed0_msr(struct vcpu_vmx *vmx, u32 msr_index, u64 data) if (!is_bitwise_subset(data, *msr, -1ULL)) return -EINVAL; - *msr = data; + switch (msr_index) { + case MSR_IA32_VMX_CR0_FIXED0: + vmx->nested.msrs.cr0_fixed0 = data; + break; + case MSR_IA32_VMX_CR4_FIXED0: + vmx->nested.msrs.cr4_fixed0 = data; + break; + default: + BUG(); + } return 0; } -- 2.17.1