From nobody Tue May 21 04:45:59 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linux.intel.com ARC-Seal: i=1; a=rsa-sha256; t=1601360223; cv=none; d=zohomail.com; s=zohoarc; b=BMwY4VRCqSQB3m72QtOSq1A64Pplq4GZUrhX7qt0oc3fEGb3MwQk9LJYJGqs69fjLpSfQGAcYmPy9uYWAGkosSxAT2TI/wrDaIvkjlR3DExofpwEtowxTjcGDS2KbI4Gx06TfN8J+A7Eay1YiWDjHrHk50F+9acsnTKPVoXN2Xg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601360223; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=LcBfgu68BGgXO2jx2WA7dANpf32EdSZf5rYJtj7MC0g=; b=UaeFEQmtCgd/L49aJm6/rzHT0CYMKLgyJJU1deQogxeA/8i4NPivgWBEwWMUHk56zEvUtC5YovBAb7ZHsrbAd9vNUcjScDLzP+7H93+Sc/azKRCXWOdashB6wsTnYzbQIVFepixOInolKgq1Tqzj6Fq336C3A2giZ0Ah/NqL3hg= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160136022346771.20542042576938; Mon, 28 Sep 2020 23:17:03 -0700 (PDT) Received: from localhost ([::1]:34172 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kN8wf-0002Oe-PC for importer@patchew.org; Tue, 29 Sep 2020 02:17:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41670) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kN8vj-0001xN-Al for qemu-devel@nongnu.org; Tue, 29 Sep 2020 02:16:03 -0400 Received: from mga07.intel.com ([134.134.136.100]:30319) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kN8vh-0000dR-2u for qemu-devel@nongnu.org; Tue, 29 Sep 2020 02:16:03 -0400 Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Sep 2020 23:15:56 -0700 Received: from sqa-gate.sh.intel.com (HELO clx-ap-likexu.tsp.org) ([10.239.48.212]) by orsmga008.jf.intel.com with ESMTP; 28 Sep 2020 23:15:54 -0700 IronPort-SDR: Ko9CbXwZfpRiJT9Je8u1imtyp1+xe2UC9uiRL4zGIHgU3HgVSRLctAWdJPnRmmf/WwDvYvI9LK HeSH863KkwBg== X-IronPort-AV: E=McAfee;i="6000,8403,9758"; a="226269555" X-IronPort-AV: E=Sophos;i="5.77,317,1596524400"; d="scan'208";a="226269555" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False IronPort-SDR: jZkTOBOXLq0ojd5Pq5/yIZvda97yNq+UwfbSR24fmBZ01jaJymxltqmkUUqlHfU9LROvPw6PWn exq/rsnTKHOA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,317,1596524400"; d="scan'208";a="340737780" From: Like Xu To: Eduardo Habkost , Paolo Bonzini , Richard Henderson Subject: [Qemu-devel PATCH v2] target/i386: add "-cpu, lbr-fmt=*" support to enable guest LBR Date: Tue, 29 Sep 2020 14:12:17 +0800 Message-Id: <20200929061217.118440-1-like.xu@linux.intel.com> X-Mailer: git-send-email 2.21.3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=134.134.136.100; envelope-from=like.xu@linux.intel.com; helo=mga07.intel.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/29 02:15:57 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The last branch recording (LBR) is a performance monitor unit (PMU) feature on Intel processors that records a running trace of the most recent branches taken by the processor in the LBR stack. The QEMU could configure whether it's enabled or not for each guest via CLI. The LBR feature would be enabled on the guest if: - the KVM is enabled and the PMU is enabled and, - the msr-based-feature IA32_PERF_CAPABILITIES is supporterd on KVM and, - the supported returned value for lbr_fmt from this msr is not zero and, - the requested guest vcpu model does support FEAT_1_ECX.CPUID_EXT_PDCM, - the configured lbr-fmt value is the same as the host lbr_fmt value. Cc: Eduardo Habkost Cc: Paolo Bonzini Signed-off-by: Like Xu --- target/i386/cpu.c | 16 ++++++++++++++++ target/i386/cpu.h | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 3ffd877dd5..b10344be01 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6461,6 +6461,13 @@ static void x86_cpu_filter_features(X86CPU *cpu, boo= l verbose) x86_cpu_get_supported_feature_word(w, false); uint64_t requested_features =3D env->features[w]; uint64_t unavailable_features =3D requested_features & ~host_feat; + if (w =3D=3D FEAT_PERF_CAPABILITIES && + (requested_features & PERF_CAP_LBR_FMT)) { + if ((host_feat & PERF_CAP_LBR_FMT) !=3D + (requested_features & PERF_CAP_LBR_FMT)) { + unavailable_features |=3D PERF_CAP_LBR_FMT; + } + } mark_unavailable_features(cpu, w, unavailable_features, prefix); } =20 @@ -6533,6 +6540,14 @@ static void x86_cpu_realizefn(DeviceState *dev, Erro= r **errp) } } =20 + if (cpu->lbr_fmt) { + if (!cpu->enable_pmu) { + error_setg(errp, "LBR is unsupported since guest PMU is disabl= ed."); + return; + } + env->features[FEAT_PERF_CAPABILITIES] |=3D cpu->lbr_fmt; + } + /* mwait extended info: needed for Core compatibility */ /* We always wake on interrupt even if host does not have the capabili= ty */ cpu->mwait.ecx |=3D CPUID_MWAIT_EMX | CPUID_MWAIT_IBE; @@ -7157,6 +7172,7 @@ static Property x86_cpu_properties[] =3D { #endif DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID), DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false), + DEFINE_PROP_UINT8("lbr-fmt", X86CPU, lbr_fmt, 0), =20 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts, HYPERV_SPINLOCK_NEVER_NOTIFY), diff --git a/target/i386/cpu.h b/target/i386/cpu.h index f519d2bfd4..c1cf8b7160 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -357,6 +357,7 @@ typedef enum X86Seg { #define ARCH_CAP_TSX_CTRL_MSR (1<<7) =20 #define MSR_IA32_PERF_CAPABILITIES 0x345 +#define PERF_CAP_LBR_FMT 0x3f =20 #define MSR_IA32_TSX_CTRL 0x122 #define MSR_IA32_TSCDEADLINE 0x6e0 @@ -1701,6 +1702,15 @@ struct X86CPU { */ bool enable_pmu; =20 + /* + * Configure LBR_FMT bits on IA32_PERF_CAPABILITIES MSR. + * This can't be enabled by default yet because it doesn't have + * ABI stability guarantees, as it is only allowed to pass all + * LBR_FMT bits returned by kvm_arch_get_supported_msr_feature() + * (that depends on host CPU and kernel capabilities) to the guest. + */ + uint8_t lbr_fmt; + /* LMCE support can be enabled/disabled via cpu option 'lmce=3Don/off'= . It is * disabled by default to avoid breaking migration between QEMU with * different LMCE configurations. --=20 2.21.3