Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4547084pxj; Tue, 22 Jun 2021 02:46:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzY6B5YjZWTu8FoWehelwHIquPkd2XGJAWs6/sZ67XX6W+iqBNOhpTg3rRnR2oU4Fcb3h0N X-Received: by 2002:a17:906:3a0e:: with SMTP id z14mr3010617eje.289.1624355196411; Tue, 22 Jun 2021 02:46:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624355196; cv=none; d=google.com; s=arc-20160816; b=MQz97qo+/Json+NiuDAMsEuhYu1L0h1qbgXgj01hqOvDEmyThQpLlrIszmUQCE2BRR rSJd1Y8/2ICkc1WA97ebbEY0GK+wB6WjTHwrqhbFe7iWbTuHiUHQDM8I+/JXC2u2ZQWd ncVjGAjiFCq/avQloEWxkD/lCHVy8ErSNpQf2FM1OlKkQ8k/pbDlTwPlUX2tzEyJPsOj ufNo/GswjKnvqW0fNlJ8WOa3oSR4x/Xa/jO1oYHaPd5UNobrplU6xrLniKD97wW2Ly8A nnni/5nRdCiCSxw/RGVFN1jYODkwS9SW26Ke/6yeEGieCTAiuDSzhekTmrdDDqTmVzNr RIIQ== 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=5Pg/4BK11fvGNx0UhohyIsl6y02UJT2NAjYdd82Z2Q8=; b=O96Hhs01F9w6p41D+xEpua3FDc4Ttvek0E2DUt906n8bEfinYlxDu4G8qdRbXxtcBS F57+ifQTk1D1EaOtYi1EhYq5JPC9lUSIqsnDnaWJtAEzkLDu0YuNwulTKbtwOK8hQWEi hFw95WuICEi/baAJDh2fnW+U1PhvDHQQ/R8M+ATZPOcPhYbJKGUXUAIHIAUKob0FcODc vrbgKk8vAxywaqPW57ZV3BoCFmBwsIPKM/uAkk59nuLMp+J89Xk5ue8p19NJQVh3l2cr zUONw6ogYOX4B110Prk2xTzhTnZNAB1ySdMJ9puHUXLeCEThgiiHp253hJ2phSLw1qp4 PBsg== 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 ia23si1602779ejc.8.2021.06.22.02.46.13; Tue, 22 Jun 2021 02:46:36 -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 S230170AbhFVJqu (ORCPT + 99 others); Tue, 22 Jun 2021 05:46:50 -0400 Received: from mga18.intel.com ([134.134.136.126]:20236 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229915AbhFVJq1 (ORCPT ); Tue, 22 Jun 2021 05:46:27 -0400 IronPort-SDR: osI+83k40QvPpPBzzdl3cCBcB6XRwq5HPA1LCKNNwlBSmtWf0FcxpVg8DGVjk91/F2Al09q3kq OSCm8PDUVhvg== X-IronPort-AV: E=McAfee;i="6200,9189,10022"; a="194331017" X-IronPort-AV: E=Sophos;i="5.83,291,1616482800"; d="scan'208";a="194331017" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2021 02:44:07 -0700 IronPort-SDR: REtP7IgFQzIWOIdPYxX+Bks26l6GSorUe2lpBvLUEKu3M/JY1WXYiZ1WbJOvxtsD94K/96C9dh P6juBF9xjKMQ== X-IronPort-AV: E=Sophos;i="5.83,291,1616482800"; d="scan'208";a="641600253" Received: from vmm_a4_icx.sh.intel.com (HELO localhost.localdomain) ([10.239.53.245]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2021 02:44:03 -0700 From: Zhu Lingshan To: peterz@infradead.org, pbonzini@redhat.com Cc: bp@alien8.de, seanjc@google.com, vkuznets@redhat.com, wanpengli@tencent.com, jmattson@google.com, joro@8bytes.org, weijiang.yang@intel.com, kan.liang@linux.intel.com, 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.linux@gmail.com, Like Xu , Zhu Lingshan Subject: [PATCH V7 11/18] KVM: x86/pmu: Add IA32_DS_AREA MSR emulation to support guest DS Date: Tue, 22 Jun 2021 17:42:59 +0800 Message-Id: <20210622094306.8336-12-lingshan.zhu@intel.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210622094306.8336-1-lingshan.zhu@intel.com> References: <20210622094306.8336-1-lingshan.zhu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Like Xu 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 Signed-off-by: Zhu Lingshan --- arch/x86/events/intel/core.c | 10 +++++++++- arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/vmx/pmu_intel.c | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 190d8d98abf0..b336bcaad626 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" @@ -3915,6 +3916,7 @@ 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 kvm_pmu *pmu = (struct kvm_pmu *)data; u64 intel_ctrl = hybrid(cpuc->pmu, intel_ctrl); u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable; @@ -3945,9 +3947,15 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data) return arr; } - if (!x86_pmu.pebs_vmx) + if (!pmu || !x86_pmu.pebs_vmx) return arr; + arr[(*nr)++] = (struct perf_guest_switch_msr){ + .msr = MSR_IA32_DS_AREA, + .host = (unsigned long)cpuc->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 662a0c036ca2..36a3aea8a544 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.27.0