From patchwork Mon Feb 20 11:00:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 9582543 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6D09B604A0 for ; Mon, 20 Feb 2017 11:03:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5FE96287E9 for ; Mon, 20 Feb 2017 11:03:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 54BC128853; Mon, 20 Feb 2017 11:03:01 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E79A9287E9 for ; Mon, 20 Feb 2017 11:03:00 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cfli7-0007Zj-QL; Mon, 20 Feb 2017 11:00:51 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cfli6-0007ZW-Gb for xen-devel@lists.xen.org; Mon, 20 Feb 2017 11:00:50 +0000 Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id CB/7E-19759-16CCAA85; Mon, 20 Feb 2017 11:00:49 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphkeJIrShJLcpLzFFi42JxWrohUjfxzKo Ig513xCyWfFzM4sDocXT3b6YAxijWzLyk/IoE1ozZy6ayFlwQrXh5ZwZjA2OTQBcjJ4eEgL/E yrYXrCA2m4C+xO4Xn5hAbBEBdYnTHReB4hwczAJ+Eoce+IKEhQWcJJ59bGAHsVkEVCV+rpkCV s4r4CEx4cVlZoiRchLnj/8EszkFPCWmHP7ABmILAdVsa3gMZatJXOu/xA7RKyhxcuYTFhCbWU BC4uCLF8wTGHlnIUnNQpJawMi0ilGjOLWoLLVI19BAL6koMz2jJDcxMwfIM9bLTS0uTkxPzUl MKtZLzs/dxAgMnXoGBsYdjNu6nA8xSnIwKYny3lmyKkKILyk/pTIjsTgjvqg0J7X4EKMMB4eS BO/000A5waLU9NSKtMwcYBDDpCU4eJREeFeBpHmLCxJzizPTIVKnGBWlxHkbQBICIImM0jy4N ljkXGKUlRLmZWRgYBDiKUgtys0sQZV/xSjOwagkzOsJMoUnM68EbvoroMVMQItveqwEWVySiJ CSamC0Vd0dMOnYi2K/Mq6k6TdXuTx8HnkuInLysdTVehvTg77eqbmkHTPz53mJxelrWiXOJVd vu5L9i5s7c+OslZmMEi/VeU3XPV7X9Mp+Lhfj9QCjZR0G1V37t3xPt1iRGZDfNUG457dGTe6H mv3Xed6ePlzA+6/i0eQd86xFpnbmFM0usksXX9SixFKckWioxVxUnAgAmYNsW5cCAAA= X-Env-Sender: prvs=21759e352=Andrew.Cooper3@citrix.com X-Msg-Ref: server-9.tower-31.messagelabs.com!1487588447!30982674!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 22112 invoked from network); 20 Feb 2017 11:00:49 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-9.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 20 Feb 2017 11:00:49 -0000 X-IronPort-AV: E=Sophos;i="5.35,186,1484006400"; d="scan'208";a="408330914" From: Andrew Cooper To: Xen-devel Date: Mon, 20 Feb 2017 11:00:30 +0000 Message-ID: <1487588434-4359-7-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1487588434-4359-1-git-send-email-andrew.cooper3@citrix.com> References: <1487588434-4359-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Jan Beulich Subject: [Xen-devel] [PATCH 06/10] x86/cpuid: Handle leaf 0x6 in guest_cpuid() X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP The thermal/performance leaf was previously hidden from HVM guests, but fully visible to PV guests. Most of the leaf refers to MSR availability, and there is nothing an unprivileged PV guest can do with the information, so hide the leaf entirely. The PV MSR handling logic as minimal support for some thermal/perf operations from the hardware domain, so leak through the implemented subset of features. Signed-off-by: Andrew Cooper --- CC: Jan Beulich --- xen/arch/x86/cpuid.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 7862d62..2a5e011 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -167,6 +167,7 @@ static void recalculate_misc(struct cpuid_policy *p) p->basic.raw[0x4] = p->basic.raw[0x7] = p->basic.raw[0xd] = EMPTY_LEAF; p->basic.raw[0x5] = EMPTY_LEAF; /* MONITOR not exposed to guests. */ + p->basic.raw[0x6] = EMPTY_LEAF; /* Therm/Power not exposed to guests. */ p->basic.raw[0x8] = EMPTY_LEAF; p->basic.raw[0xc] = EMPTY_LEAF; @@ -648,8 +649,7 @@ static void pv_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) *res = EMPTY_LEAF; break; - case 0x0 ... 0x5: - case 0x7 ... 0x9: + case 0x0 ... 0x9: case 0xc ... XSTATE_CPUID: case 0x80000000 ... 0xffffffff: ASSERT_UNREACHABLE(); @@ -683,8 +683,7 @@ static void hvm_cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) res->a = (res->a & ~0xff) | 3; break; - case 0x0 ... 0x5: - case 0x7 ... 0x9: + case 0x0 ... 0x9: case 0xc ... XSTATE_CPUID: case 0x80000000 ... 0xffffffff: ASSERT_UNREACHABLE(); @@ -744,7 +743,7 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, goto legacy; case 0x0 ... 0x3: - case 0x5: + case 0x5 ... 0x6: case 0x8 ... 0x9: case 0xc: *res = p->basic.raw[leaf]; @@ -942,6 +941,22 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, *res = raw_policy.basic.raw[leaf]; break; + case 0x6: + /* + * Leak the implemented-subset of therm/power features into PV + * hardware domain kernels. + */ + if ( is_pv_domain(d) && is_hardware_domain(d) && + guest_kernel_mode(v, guest_cpu_user_regs()) ) + { + /* Temp, Turbo, ARAT. */ + res->a = raw_policy.basic.raw[leaf].a & 0x00000007; + + /* APERF/MPERF, perf/enery bias. */ + res->c = raw_policy.basic.raw[leaf].c & 0x00000009; + } + break; + case 0x7: switch ( subleaf ) {