Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3127382pxj; Mon, 10 May 2021 19:45:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyK1vUt1eNtb1Fc/456Sf8ca9I8e/BYbMEQJm/CnhTTRfa/ah6kU/MthWBwQjcP4LGBRX3y X-Received: by 2002:aa7:d5c9:: with SMTP id d9mr33502623eds.153.1620701139013; Mon, 10 May 2021 19:45:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620701139; cv=none; d=google.com; s=arc-20160816; b=tM0tTYTbeD95xv3c8LBdsOhMxroOb8pg4zUub3/11iazITGC7VADKH2Zk8FSUcnfoO /q1IGoEoa/lnW+KypeALbDwsF0YcnpKNUrCmGZr+iFd3lIS+DNeVBaxasTOd6w7bxnba AF0Bu/EPUFVxw8jsyUaeDYaB/OBpvGcaKHMSjJ8SO4TvItvC1pg3bpbaMR3+eHupSuD7 UKXn9l6OUDHF62EdHa2qL6eYnLoapKU1u9w+S0ghC5xiHq/nQ3DlyekbZlPtC8bU+BpY 1QlV+m4EvUId1W7/M6K0xa5D4JWXiMQNmXWwFoShFzCUZ4e9LGpv6HKXcKWMYzCoZMNv eS3Q== 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=8JTTXy+NYHOPbD/OgkmznTUaFGNH+IafuDEBIBcbZzw=; b=Oa1kR6TNxw6bF/FL0BtDEvuvYsgn8mipE8SXUne2Dg//lPKESsAvm1jZe57CQNGbkL kIPrDeKxjxB0JCDeyPEiQYIi5PVKFIPRdoorXY2DpwP2A+6aqE4NEZHx8/egg0u2kn0Y AMy8bINFtfshYm5M/mdGvL9xk94pcO7+FvvBsscqPWO+UXAo2+p09wWVA4/UjLgYk/Mq IsEf3J3THLOpFevPZxOtjJ+gkr3bu47Dkna8+rpCLu8oYOT8nJnkDTmL7KCSW+l456qa tG2hYBzfm2bxPJ8g65ItETGcSRbKrtYGaWMo1oWhOQRP4UHRaSu1QjD78Pjij1vXr0g3 sWvA== 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 y4si16133342edo.477.2021.05.10.19.45.15; Mon, 10 May 2021 19:45:39 -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 S230306AbhEKCow (ORCPT + 99 others); Mon, 10 May 2021 22:44:52 -0400 Received: from mga03.intel.com ([134.134.136.65]:7565 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230118AbhEKCoi (ORCPT ); Mon, 10 May 2021 22:44:38 -0400 IronPort-SDR: OGwU1misgQIxZkUHa/XZsHalebpD8m8YUCUsHt6ayvn7Q+YFqS9jJQoDZ/1+3A/qhzu9gCM209 ij3xSoCewi2g== X-IronPort-AV: E=McAfee;i="6200,9189,9980"; a="199391227" X-IronPort-AV: E=Sophos;i="5.82,290,1613462400"; d="scan'208";a="199391227" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 May 2021 19:43:32 -0700 IronPort-SDR: qAD80/PhAC7RQ/PpYT2VIbBxoBEfy9BtYzWmHBr+Qk6Jq5LoR8NLWAX+S+5mzCtxNxSv2OTr/p liH0jnEOx5VA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,290,1613462400"; d="scan'208";a="468591820" Received: from clx-ap-likexu.sh.intel.com ([10.239.48.108]) by fmsmga002.fm.intel.com with ESMTP; 10 May 2021 19:43:27 -0700 From: Like Xu To: Peter Zijlstra , Paolo Bonzini Cc: Borislav Petkov , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , weijiang.yang@intel.com, Kan Liang , ak@linux.intel.com, wei.w.wang@intel.com, eranian@google.com, liuxiangdong5@huawei.com, linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org, Like Xu Subject: [PATCH v6 08/16] KVM: x86/pmu: Add IA32_DS_AREA MSR emulation to support guest DS Date: Tue, 11 May 2021 10:42:06 +0800 Message-Id: <20210511024214.280733-9-like.xu@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210511024214.280733-1-like.xu@linux.intel.com> References: <20210511024214.280733-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 c791765f4761..de3bc8dfe85e 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" @@ -3897,6 +3898,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 intel_ctrl = hybrid(cpuc->pmu, intel_ctrl); u64 pebs_mask = (x86_pmu.flags & PMU_FL_PEBS_ALL) ? cpuc->pebs_enabled : (cpuc->pebs_enabled & PEBS_COUNTER_MASK); @@ -3908,7 +3911,7 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask), }; - if (!x86_pmu.pebs) + if (!pmu || !x86_pmu.pebs_vmx) return arr; /* @@ -3931,6 +3934,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 0a42079560ac..296bc3eecdc6 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -473,6 +473,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.31.1