Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp432914pxb; Wed, 14 Apr 2021 20:22:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzjpIi/rrgT7U14fIyx5/Gtw4ocVpHYzoPjespQnv3jJ6NOaSHOQDL4lTyfLPSR4o+ecMR1 X-Received: by 2002:a50:e848:: with SMTP id k8mr1251031edn.179.1618456946231; Wed, 14 Apr 2021 20:22:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618456946; cv=none; d=google.com; s=arc-20160816; b=m0PdwKlDqc3DRutJtLRSOQDC0xtaoaY496BNIsDH4u5l+sVzz5GNjLBQGeMSyLlSDa 5QKqeEw5aPba2aQxQxYkqCSzhXSDHpa/jsGMbyI4z6i+KZcvur93Fpjvi8PMOB7oKkM1 LqKrUupIu1GGFuUEM6Z9CKTh4LuYI3kYNHA+H2j9ttBv158Ujdg9SfWxDda/avS+5rma LVRhTMlZa49UB03+OTYlY+S63z6Kx++L4OlrFQgT6lp1bMazWqjQUOFHfqnB/w7boeEN oHnteOekb28x47SpTSFRKq3u/BJKepSMpL05E0mEVjnzDHMLNltBcoiYR3qIYH9NBQuI t4vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=zGiUWj29pqzR2SPSsDIMfdBCSVQLpHQ3T7fzlAM+myA=; b=zeIn9y6KxKmz65zXWNePIH3gV+vKvSUHEzqrNPVnWtDqhmEG7UpRDnXjaXsiXyKPaT kOcxteUI2DonjlIQRwOKiNWUqcN+7QKtU+663BTXObhe8Ilx9USV858U19tKVcLyj++g xwMuHdl2KHoq2Q1N32umzflk87lr+CEd9EcLAzAcZQOIyVP4NlaiZdz6YXUNAOZqycrQ kYqyxwRibQiKgaxvMkIkSQOytXBKG5vntaLz1vSS/q5g4DDLhjJRf/451hUcV3CnYfPl fXXZjQfLv93cHqquvt1Iat4KMRGVkA+PBUdYnkPD9VW93l/3igr4TXsT7CpLf86h4TFE Zccg== 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 bf5si1185107edb.64.2021.04.14.20.22.03; Wed, 14 Apr 2021 20:22:26 -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 S229853AbhDODVX (ORCPT + 99 others); Wed, 14 Apr 2021 23:21:23 -0400 Received: from mga01.intel.com ([192.55.52.88]:10590 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229618AbhDODVT (ORCPT ); Wed, 14 Apr 2021 23:21:19 -0400 IronPort-SDR: 3iEL1tZ/qZXx+dIb7d29pXkhTImxIw2FtdiLT5LVxp3FvZyFa0Kq2239Py/pOcWaelYp92VM0X i21hwKf0bWYg== X-IronPort-AV: E=McAfee;i="6200,9189,9954"; a="215281558" X-IronPort-AV: E=Sophos;i="5.82,223,1613462400"; d="scan'208";a="215281558" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2021 20:20:56 -0700 IronPort-SDR: 6teKD2mLi56PBHwgnzzX5UIhXjkbGQUW4bcFEOZFF+MMAMrGOGhx5pdZ8rdMqV6rgNDVeqoYAW ZFX3kfj8+yIA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,223,1613462400"; d="scan'208";a="425014021" Received: from clx-ap-likexu.sh.intel.com ([10.239.48.108]) by orsmga008.jf.intel.com with ESMTP; 14 Apr 2021 20:20:51 -0700 From: Like Xu To: peterz@infradead.org, Paolo Bonzini , Sean Christopherson Cc: andi@firstfloor.org, kan.liang@linux.intel.com, wei.w.wang@intel.com, eranian@google.com, liuxiangdong5@huawei.com, Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, Like Xu , Andi Kleen Subject: [PATCH v5 08/16] KVM: x86/pmu: Add IA32_DS_AREA MSR emulation to support guest DS Date: Thu, 15 Apr 2021 11:20:08 +0800 Message-Id: <20210415032016.166201-9-like.xu@linux.intel.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210415032016.166201-1-like.xu@linux.intel.com> References: <20210415032016.166201-1-like.xu@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When CPUID.01H:EDX.DS[21] is set, the IA32_DS_AREA MSR exists and points to the linear address of the first byte of the DS buffer management area, which is used to manage the PEBS records. When guest PEBS is enabled, the MSR_IA32_DS_AREA MSR will be added to the perf_guest_switch_msr() and switched during the VMX transitions just like CORE_PERF_GLOBAL_CTRL MSR. The WRMSR to IA32_DS_AREA MSR brings a #GP(0) if the source register contains a non-canonical address. Originally-by: Andi Kleen Co-developed-by: Kan Liang Signed-off-by: Kan Liang Signed-off-by: Like Xu --- arch/x86/events/intel/core.c | 11 ++++++++++- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/vmx/pmu_intel.c | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 4e5ed12cb52d..6cd857066d69 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "../perf_event.h" @@ -3838,6 +3839,8 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) { struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); struct perf_guest_switch_msr *arr = cpuc->guest_switch_msrs; + struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds); + struct kvm_pmu *pmu = (struct kvm_pmu *)data; u64 pebs_mask = (x86_pmu.flags & PMU_FL_PEBS_ALL) ? cpuc->pebs_enabled : (cpuc->pebs_enabled & PEBS_COUNTER_MASK); @@ -3849,7 +3852,7 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) (~cpuc->intel_ctrl_host_mask | ~pebs_mask), }; - if (!x86_pmu.pebs) + if (!pmu || !x86_pmu.pebs_vmx) return arr; /* @@ -3872,6 +3875,12 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) if (!x86_pmu.pebs_vmx) return arr; + arr[(*nr)++] = (struct perf_guest_switch_msr){ + .msr = MSR_IA32_DS_AREA, + .host = (unsigned long)ds, + .guest = pmu->ds_area, + }; + arr[*nr] = (struct perf_guest_switch_msr){ .msr = MSR_IA32_PEBS_ENABLE, .host = cpuc->pebs_enabled & ~cpuc->intel_ctrl_guest_mask, diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index a48abcad3329..c9bc8352b1f0 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -460,6 +460,7 @@ struct kvm_pmu { DECLARE_BITMAP(all_valid_pmc_idx, X86_PMC_IDX_MAX); DECLARE_BITMAP(pmc_in_use, X86_PMC_IDX_MAX); + u64 ds_area; u64 pebs_enable; u64 pebs_enable_mask; diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 9938b485c31c..5584b8dfadb3 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -223,6 +223,9 @@ static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) case MSR_IA32_PEBS_ENABLE: ret = vcpu->arch.perf_capabilities & PERF_CAP_PEBS_FORMAT; break; + case MSR_IA32_DS_AREA: + ret = guest_cpuid_has(vcpu, X86_FEATURE_DS); + break; default: ret = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0) || get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0) || @@ -373,6 +376,9 @@ static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) case MSR_IA32_PEBS_ENABLE: msr_info->data = pmu->pebs_enable; return 0; + case MSR_IA32_DS_AREA: + msr_info->data = pmu->ds_area; + return 0; default: if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || (pmc = get_gp_pmc(pmu, msr, MSR_IA32_PMC0))) { @@ -441,6 +447,11 @@ static int intel_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) return 0; } break; + case MSR_IA32_DS_AREA: + if (is_noncanonical_address(data, vcpu)) + return 1; + pmu->ds_area = data; + return 0; default: if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0)) || (pmc = get_gp_pmc(pmu, msr, MSR_IA32_PMC0))) { -- 2.30.2