From patchwork Mon Aug 20 17:32:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Drew Schmitt X-Patchwork-Id: 10570577 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ECCE813B6 for ; Mon, 20 Aug 2018 17:32:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CF2E9298D5 for ; Mon, 20 Aug 2018 17:32:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C0E3C298D6; Mon, 20 Aug 2018 17:32:33 +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=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9EA6229859 for ; Mon, 20 Aug 2018 17:32:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726148AbeHTUsw (ORCPT ); Mon, 20 Aug 2018 16:48:52 -0400 Received: from mail-it0-f74.google.com ([209.85.214.74]:42167 "EHLO mail-it0-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726077AbeHTUsw (ORCPT ); Mon, 20 Aug 2018 16:48:52 -0400 Received: by mail-it0-f74.google.com with SMTP id g187-v6so248423ita.7 for ; Mon, 20 Aug 2018 10:32:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=uZo5iNVCuR94bClyFGjnyP3wT9dBulRGbAeLHrDKxkY=; b=EtKY0AqCMhztUTamytqXitcz6S06XyRJw2q2L7mscFC3egJ8euFsCoMbXSTq7e5gfo D1GcYFxzQFp+LM+2duwOiedaaeZ1ySn7eooc1JjZMNZZceP7znuQcIEl1pWWq9YyowT5 3kIu7JJYxzxnQtUuhPwIiHfWblr+Ej7aIbpWh9yb41MsymDtuP0MSrzE7z7cI8j4QQ/1 swDGstNv53FV9YMKgNbHEF7qqM8K5DP5qYsgaJlGBnkM/hZRBL2j0LLN8ZHEPchrupCJ m04aiYNgb6buZA9XnUtl7gDkpASuYUdbRJ3dH8VPQCLGVeCy8tU37KnanvU77UgkY6Ol 4gvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=uZo5iNVCuR94bClyFGjnyP3wT9dBulRGbAeLHrDKxkY=; b=ityftTV91qICFrK0R3317lNc277DgSamy5cXKfoeDgFAQDGe0z4KFOchQB5N20e+Sf oTPn1BAjXJKHDM48JtoNN/dXFLTqRkLD4MfZ66HY7Gu5ARJ70vSf78y6klLqVZyV5Mmj rymlL3lTaJnFsCoFtdXZ90qpmsbmkFboXDQ2ZoeFIUU245dg2LkS4TrOVfEla2kXKzT0 qpU0cO85FU6eCWlFIXsVObrCCJ4eyXiBFFDPPjmn+N9kPKolVgKGgSnCKs9fsrF35Bkn 8LfHvp8liXyM9adKqu3jseKBSogN8RlazQwDlHIfgcGvtDsKL2iVAWqQNLWCwF9dMzuR RRJg== X-Gm-Message-State: AOUpUlHMRrV6k8lA+zLmExZo966bbjAih8R730ZjsUKDOhv2jyHkQpwC etPHqcqzlqp4TmD5em/xfJZH9rDxw8YgPlSnCwU1rQlD0RW6wSPn1EcZtKVzZxEhmk8F+hyJjaR VL4vBhZ6nVsrDXZ7p/oykQY6KqoTTeb+lbY7V9Q1iN7TD5fwLG09x7R0= X-Google-Smtp-Source: AA+uWPwWSaMIQARjEZgdEytWfKobFbz5TEN6VgyjceJmHR/VoeWQS/6HkJlQ3j/arMMjHquVWL8GkofdoA== X-Received: by 2002:a24:e513:: with SMTP id g19-v6mr19053446iti.4.1534786339809; Mon, 20 Aug 2018 10:32:19 -0700 (PDT) Date: Mon, 20 Aug 2018 10:32:14 -0700 Message-Id: <20180820173216.242389-1-dasch@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.18.0.865.gffc8e1a3cd6-goog Subject: [PATCH v3 1/3] KVM: x86: Turbo bits in MSR_PLATFORM_INFO From: Drew Schmitt To: kvm@vger.kernel.org Cc: konrad.wilk@oracle.com, jmattson@google.com, Drew Schmitt Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Allow userspace to set turbo bits in MSR_PLATFORM_INFO. Previously, only the CPUID faulting bit was settable. But now any bit in MSR_PLATFORM_INFO would be settable. This can be used, for example, to convey frequency information about the platform on which the guest is running. Signed-off-by: Drew Schmitt --- arch/x86/kvm/x86.c | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 0046aa70205aa..0278cde1893ca 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2503,7 +2503,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) break; case MSR_PLATFORM_INFO: if (!msr_info->host_initiated || - data & ~MSR_PLATFORM_INFO_CPUID_FAULT || (!(data & MSR_PLATFORM_INFO_CPUID_FAULT) && cpuid_fault_enabled(vcpu))) return 1; From patchwork Mon Aug 20 17:32:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Drew Schmitt X-Patchwork-Id: 10570579 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4BBB91390 for ; Mon, 20 Aug 2018 17:32:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 326D32985F for ; Mon, 20 Aug 2018 17:32:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2607E298D7; Mon, 20 Aug 2018 17:32:34 +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=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4CBCC2985F for ; Mon, 20 Aug 2018 17:32:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726217AbeHTUsz (ORCPT ); Mon, 20 Aug 2018 16:48:55 -0400 Received: from mail-qt0-f201.google.com ([209.85.216.201]:51198 "EHLO mail-qt0-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726077AbeHTUsz (ORCPT ); Mon, 20 Aug 2018 16:48:55 -0400 Received: by mail-qt0-f201.google.com with SMTP id e14-v6so13935323qtp.17 for ; Mon, 20 Aug 2018 10:32:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=cim/WpWrBN1nDHI2Lj8m+fMDg6uA6S564ubHIa7R9CI=; b=nQyqMgIKOgJ4xRWub593Oyk9+Faerom2GcbZGwyJe2B0gg57EddpWLuU5LQ+sZDnfI HFnP9Z01Y9do4G3c5UcUlc7VIoIVzGnJO7Iy76w342nKesyTHbkzA+2wvLjzeF++yldT dYX2jKaKgg1F1d+XkHjVT6VPmJSH1nqujcSzFYZr+/5KqWq4p6CRcJnpnPVXeVt2A1Il AEPPXM1BfMT7pjeiMjm8HgXcBwdKlZ94I0kvwqauIKiV0WCnbfX9LQNe8v6eOMHBLn/E zVTxAL63jC1PGmHdwzMt9uyBx9wxfanmTEWJnLlQxWLoudOt3BZhyfUmsPinWcMUVfqt IAqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=cim/WpWrBN1nDHI2Lj8m+fMDg6uA6S564ubHIa7R9CI=; b=l4jLsFchpgWuB1L0QL4HEfwrtuKUIxQ5IYGw+jBoZ5uc/aWzZm7VeofoviGbDTQ/WA oTzdFh6FvuvdALNIoSyZhAwraPqyxvh1cubUuwQWI691WL1M5mwzsksUZrjKBx+ND9L2 r0bF+zLZVoMQEWGC+fGTcHf9whvSwPtWS86x4QNWFDhxIhyWVGRWkkh/A/bTrH3uihvE BX3GYKfnKxbAjDhMhWxCEfCik5Rzb1C0du70r6EFQ2nHgflPoo0jYlkzLlx2PsXQBIj7 P9b1dMzH9g+MYbR738yBB4gP1QyF9P+d4kwB+crX/KgHmoMOrgPCjPC2AiiaNjA/rEPQ mGZg== X-Gm-Message-State: AOUpUlEIEFsMzCpQcWlBPyUAXIG/pYPMemLcQmZqliQ+tSDP+ZrDYd/0 nSpvh/dmWwrC80cl9vJ36j/jzJ5Guj2sYvApIkdwfXOQkA2k66lj33W+us94fTUajCfF66HPz4+ LEnRDkk0hPcaxBDYCph5KAN+JTjLIdtvnEnPfqyyXSsXAf85byJcEzNI= X-Google-Smtp-Source: AA+uWPy1Smt8Ci0noImlb/WXSg4OB5ZfL6pMcPe4fhN4xm8d3qP3lH2+ViLYz9E/HGuVtVdz1cC4MnqL5Q== X-Received: by 2002:a0c:d2da:: with SMTP id x26-v6mr25608500qvh.36.1534786342841; Mon, 20 Aug 2018 10:32:22 -0700 (PDT) Date: Mon, 20 Aug 2018 10:32:15 -0700 In-Reply-To: <20180820173216.242389-1-dasch@google.com> Message-Id: <20180820173216.242389-2-dasch@google.com> Mime-Version: 1.0 References: <20180820173216.242389-1-dasch@google.com> X-Mailer: git-send-email 2.18.0.865.gffc8e1a3cd6-goog Subject: [PATCH v3 2/3] KVM: x86: Control guest reads of MSR_PLATFORM_INFO From: Drew Schmitt To: kvm@vger.kernel.org Cc: konrad.wilk@oracle.com, jmattson@google.com, Drew Schmitt Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add KVM_CAP_MSR_PLATFORM_INFO so that userspace can disable guest access to reads of MSR_PLATFORM_INFO. Disabling access to reads of this MSR gives userspace the control to "expose" this platform-dependent information to guests in a clear way. As it exists today, guests that read this MSR would get unpopulated information if userspace hadn't already set it (and prior to this patch series, only the CPUID faulting information could have been populated). This existing interface could be confusing if guests don't handle the potential for incorrect/incomplete information gracefully (e.g. zero reported for base frequency). Signed-off-by: Drew Schmitt --- v2 -> v3: added more to commit message --- Documentation/virtual/kvm/api.txt | 9 +++++++++ arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/x86.c | 10 ++++++++++ include/uapi/linux/kvm.h | 1 + 4 files changed, 22 insertions(+) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index d10944e619d3d..29b54ed0978c2 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -4391,6 +4391,15 @@ all such vmexits. Do not enable KVM_FEATURE_PV_UNHALT if you disable HLT exits. +7.14 KVM_CAP_MSR_PLATFORM_INFO + +Architectures: x86 +Parameters: args[0] whether feature should be enabled or not + +With this capability, a guest may read the MSR_PLATFORM_INFO MSR. Otherwise, +a #GP would be raised when the guest tries to access. Currently, this +capability does not enable write permissions of this MSR for the guest. + 8. Other capabilities. ---------------------- diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index c13cd28d9d1be..c0497c7a4869f 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -853,6 +853,8 @@ struct kvm_arch { bool x2apic_format; bool x2apic_broadcast_quirk_disabled; + + bool guest_can_read_msr_platform_info; }; struct kvm_vm_stat { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 0278cde1893ca..b27d88fc6eb8f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2743,6 +2743,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) msr_info->data = vcpu->arch.osvw.status; break; case MSR_PLATFORM_INFO: + if (!msr_info->host_initiated && + !vcpu->kvm->arch.guest_can_read_msr_platform_info) + return 1; msr_info->data = vcpu->arch.msr_platform_info; break; case MSR_MISC_FEATURES_ENABLES: @@ -2890,6 +2893,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_SPLIT_IRQCHIP: case KVM_CAP_IMMEDIATE_EXIT: case KVM_CAP_GET_MSR_FEATURES: + case KVM_CAP_MSR_PLATFORM_INFO: r = 1; break; case KVM_CAP_SYNC_REGS: @@ -4259,6 +4263,10 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, kvm->arch.pause_in_guest = true; r = 0; break; + case KVM_CAP_MSR_PLATFORM_INFO: + kvm->arch.guest_can_read_msr_platform_info = cap->args[0]; + r = 0; + break; default: r = -EINVAL; break; @@ -8724,6 +8732,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) kvm->arch.kvmclock_offset = -ktime_get_boot_ns(); pvclock_update_vm_gtod_copy(kvm); + kvm->arch.guest_can_read_msr_platform_info = true; + INIT_DELAYED_WORK(&kvm->arch.kvmclock_update_work, kvmclock_update_fn); INIT_DELAYED_WORK(&kvm->arch.kvmclock_sync_work, kvmclock_sync_fn); diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index b6270a3b38e9f..f3367041b609b 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -949,6 +949,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_GET_MSR_FEATURES 153 #define KVM_CAP_HYPERV_EVENTFD 154 #define KVM_CAP_HYPERV_TLBFLUSH 155 +#define KVM_CAP_MSR_PLATFORM_INFO 156 #ifdef KVM_CAP_IRQ_ROUTING From patchwork Mon Aug 20 17:32:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Drew Schmitt X-Patchwork-Id: 10570581 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BA83E17E0 for ; Mon, 20 Aug 2018 17:32:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9E540298CA for ; Mon, 20 Aug 2018 17:32:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6D859298D1; Mon, 20 Aug 2018 17:32:35 +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=-15.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 64CBC29893 for ; Mon, 20 Aug 2018 17:32:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726260AbeHTUs6 (ORCPT ); Mon, 20 Aug 2018 16:48:58 -0400 Received: from mail-yw1-f74.google.com ([209.85.161.74]:48580 "EHLO mail-yw1-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726237AbeHTUs6 (ORCPT ); Mon, 20 Aug 2018 16:48:58 -0400 Received: by mail-yw1-f74.google.com with SMTP id p17-v6so3215594ywp.15 for ; Mon, 20 Aug 2018 10:32:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=csdpy1/dDJo63ia5P7+uY/81+E74itqgKZUkAiBNXhk=; b=VhDw1SXnQNSILFZ1WcmSpqiJk2fjBFr4q4u3/BK58hz2dZiihT9RXTeYed/Rw5SPAj k46nT1BbxGOYgVuyG1ZBk6jYtPoB75lU1i/VUB6D7IRag/HgUiwBcTXzlUsRzHyn8CZD gvcM3SOWb076r7iLoro9eE10u5pXVEAvCMkwmC/9qekdNJDVL8js1w3tQSwapTmrJLxK 2VIfnH1r0QG4yUcSLP2Zza430oe4M1lys58CdJWsbKuDSXIL/85ETa2ckg9gbbxpEVLo PrEA/kCUjCLrlp5C8SKNDRPlvmqr8O85c9QF9hS8jweHfUfbZGC+sPchST8jVBapYm4j SFDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=csdpy1/dDJo63ia5P7+uY/81+E74itqgKZUkAiBNXhk=; b=DHRW7H+hCenXxWoKRginzJu0VtKgtbP5zN+D01Zdn3F7uj8XSxOMjlEQS97khq6/Q2 DEb5Yy0pgShvu5p6EfPr2LL/ERDtqYgSKkUkvM7k2Urt9coeLVxMGqaVMaLXqJfNElv4 b1c+4LcI4Hy6gSXADu3Y+e0nAxyK2OOg88awohjU+vrfHjAkjm/T1AeMvWNbvXEApKyw TwPscd8IyJhXHeh4BPpsnPWOj7ww/18xsEni7SJWBSfIQet5ne9Nwem6FbYKQtFnR+P/ 7PpXx3hYqxAioHDFVk+Z3WO7fDMttKKMreZAMFizpS7Vt6cmlX9X1lq7HxvRAOzk6/B6 /8pA== X-Gm-Message-State: AOUpUlGl8KSBisiZyFIC/MLV/QoQQzB6CtUC1VnnbN4vF4Hd9lpsvu2Y 4izZ6cPk8azEqsl+bKZxB5kmpFXsnngIX5JiePkTlM0j8+QWdSYLmLiz+18RLzfP8aTnXaGTfTN MyNcaNAVLjZDepkBadDOHVy3elmru3m6IeS1Pi1wrJkbTunIMMcCEOt0= X-Google-Smtp-Source: AA+uWPyx2Uyv7GoJn8RFf4WyvKnyZKdx8LywzMCDFMNlOWDGrZlOdEblK4o22r1J8hsjO2Up1LIKRDRn0A== X-Received: by 2002:a81:2a82:: with SMTP id q124-v6mr13251386ywq.90.1534786346172; Mon, 20 Aug 2018 10:32:26 -0700 (PDT) Date: Mon, 20 Aug 2018 10:32:16 -0700 In-Reply-To: <20180820173216.242389-1-dasch@google.com> Message-Id: <20180820173216.242389-3-dasch@google.com> Mime-Version: 1.0 References: <20180820173216.242389-1-dasch@google.com> X-Mailer: git-send-email 2.18.0.865.gffc8e1a3cd6-goog Subject: [PATCH v3 3/3] kvm: selftests: Add platform_info_test From: Drew Schmitt To: kvm@vger.kernel.org Cc: konrad.wilk@oracle.com, jmattson@google.com, Drew Schmitt Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Test guest access to MSR_PLATFORM_INFO when the capability is enabled or disabled. Signed-off-by: Drew Schmitt --- tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 3 +- .../testing/selftests/kvm/include/kvm_util.h | 4 + tools/testing/selftests/kvm/lib/kvm_util.c | 89 +++++++++++++ .../selftests/kvm/platform_info_test.c | 121 ++++++++++++++++++ 5 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/kvm/platform_info_test.c diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore index 63fc1ab9248fa..8078891ded84a 100644 --- a/tools/testing/selftests/kvm/.gitignore +++ b/tools/testing/selftests/kvm/.gitignore @@ -1,3 +1,4 @@ +platform_info_test set_sregs_test sync_regs_test vmx_tsc_adjust_test diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index d9d00319b07cd..85e3eb4108c28 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -6,7 +6,8 @@ UNAME_M := $(shell uname -m) LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/sparsebit.c LIBKVM_x86_64 = lib/x86.c lib/vmx.c -TEST_GEN_PROGS_x86_64 = set_sregs_test +TEST_GEN_PROGS_x86_64 = platform_info_test +TEST_GEN_PROGS_x86_64 += set_sregs_test TEST_GEN_PROGS_x86_64 += sync_regs_test TEST_GEN_PROGS_x86_64 += vmx_tsc_adjust_test diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h index 637b7017b6ee5..a7e34eaccadba 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -50,6 +50,7 @@ enum vm_mem_backing_src_type { }; int kvm_check_cap(long cap); +int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap); struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm); void kvm_vm_free(struct kvm_vm *vmp); @@ -103,6 +104,9 @@ void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_vcpu_events *events); void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_vcpu_events *events); +uint64_t vcpu_get_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index); +void vcpu_set_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index, + uint64_t msr_value); const char *exit_reason_str(unsigned int exit_reason); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 37e2a787d2fcc..2d13b26d32215 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -62,6 +62,29 @@ int kvm_check_cap(long cap) return ret; } +/* VM Enable Capability + * + * Input Args: + * vm - Virtual Machine + * cap - Capability + * + * Output Args: None + * + * Return: On success, 0. On failure a TEST_ASSERT failure is produced. + * + * Enables a capability (KVM_CAP_*) on the VM. + */ +int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap) +{ + int ret; + + ret = ioctl(vm->fd, KVM_ENABLE_CAP, cap); + TEST_ASSERT(ret == 0, "KVM_ENABLE_CAP IOCTL failed,\n" + " rc: %i errno: %i", ret, errno); + + return ret; +} + /* VM Create * * Input Args: @@ -1124,6 +1147,72 @@ void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid, ret, errno); } +/* VCPU Get MSR + * + * Input Args: + * vm - Virtual Machine + * vcpuid - VCPU ID + * msr_index - Index of MSR + * + * Output Args: None + * + * Return: On success, value of the MSR. On failure a TEST_ASSERT is produced. + * + * Get value of MSR for VCPU. + */ +uint64_t vcpu_get_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index) +{ + struct vcpu *vcpu = vcpu_find(vm, vcpuid); + struct { + struct kvm_msrs header; + struct kvm_msr_entry entry; + } buffer = {}; + int r; + + TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid); + buffer.header.nmsrs = 1; + buffer.entry.index = msr_index; + r = ioctl(vcpu->fd, KVM_GET_MSRS, &buffer.header); + TEST_ASSERT(r == 1, "KVM_GET_MSRS IOCTL failed,\n" + " rc: %i errno: %i", r, errno); + + return buffer.entry.data; +} + +/* VCPU Set MSR + * + * Input Args: + * vm - Virtual Machine + * vcpuid - VCPU ID + * msr_index - Index of MSR + * msr_value - New value of MSR + * + * Output Args: None + * + * Return: On success, nothing. On failure a TEST_ASSERT is produced. + * + * Set value of MSR for VCPU. + */ +void vcpu_set_msr(struct kvm_vm *vm, uint32_t vcpuid, uint64_t msr_index, + uint64_t msr_value) +{ + struct vcpu *vcpu = vcpu_find(vm, vcpuid); + struct { + struct kvm_msrs header; + struct kvm_msr_entry entry; + } buffer = {}; + int r; + + TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid); + memset(&buffer, 0, sizeof(buffer)); + buffer.header.nmsrs = 1; + buffer.entry.index = msr_index; + buffer.entry.data = msr_value; + r = ioctl(vcpu->fd, KVM_SET_MSRS, &buffer.header); + TEST_ASSERT(r == 1, "KVM_SET_MSRS IOCTL failed,\n" + " rc: %i errno: %i", r, errno); +} + /* VM VCPU Args Set * * Input Args: diff --git a/tools/testing/selftests/kvm/platform_info_test.c b/tools/testing/selftests/kvm/platform_info_test.c new file mode 100644 index 0000000000000..3c14959a09210 --- /dev/null +++ b/tools/testing/selftests/kvm/platform_info_test.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Test for x86 KVM_CAP_MSR_PLATFORM_INFO + * + * Copyright (C) 2018, Google LLC. + * + * This work is licensed under the terms of the GNU GPL, version 2. + * + * Verifies expected behavior of controlling guest access to + * MSR_PLATFORM_INFO. + */ + +#define _GNU_SOURCE /* for program_invocation_short_name */ +#include +#include +#include +#include +#include + +#include "test_util.h" +#include "kvm_util.h" +#include "x86.h" + +#define VCPU_ID 0 +#define PORT_HOST_SYNC 0x1000 +#define MSR_PLATFORM_INFO_MAX_TURBO_RATIO 0xff00 + +static void __exit_to_l0(uint16_t port, unsigned long arg) +{ + __asm__ __volatile__("in %[port], %%al" + : + : [port]"d"(port), "D"(arg) + : "rax"); +} + +#define exit_to_l0(_port, _arg) __exit_to_l0(_port, (unsigned long) (_arg)) + +static void guest_code(void) +{ + uint64_t msr_platform_info; + + for (;;) { + msr_platform_info = rdmsr(MSR_PLATFORM_INFO); + exit_to_l0(PORT_HOST_SYNC, msr_platform_info); + asm volatile ("inc %r11"); + } +} + +static void set_msr_platform_info_enabled(struct kvm_vm *vm, bool enable) +{ + struct kvm_enable_cap cap = {}; + + cap.cap = KVM_CAP_MSR_PLATFORM_INFO; + cap.flags = 0; + cap.args[0] = (int)enable; + vm_enable_cap(vm, &cap); +} + +static void test_msr_platform_info_enabled(struct kvm_vm *vm) +{ + struct kvm_run *run = vcpu_state(vm, VCPU_ID); + struct kvm_regs regs; + + set_msr_platform_info_enabled(vm, true); + vcpu_run(vm, VCPU_ID); + TEST_ASSERT(run->exit_reason == KVM_EXIT_IO, + "Exit_reason other than KVM_EXIT_IO: %u (%s),\n", + run->exit_reason, + exit_reason_str(run->exit_reason)); + TEST_ASSERT(run->io.port == PORT_HOST_SYNC, + "Received IO from port other than PORT_HOST_SYNC: %u\n", + run->io.port); + vcpu_regs_get(vm, VCPU_ID, ®s); + TEST_ASSERT((regs.rdi & MSR_PLATFORM_INFO_MAX_TURBO_RATIO) == + MSR_PLATFORM_INFO_MAX_TURBO_RATIO, + "Expected MSR_PLATFORM_INFO to have max turbo ratio mask: %i.", + MSR_PLATFORM_INFO_MAX_TURBO_RATIO); +} + +static void test_msr_platform_info_disabled(struct kvm_vm *vm) +{ + struct kvm_run *run = vcpu_state(vm, VCPU_ID); + + set_msr_platform_info_enabled(vm, false); + vcpu_run(vm, VCPU_ID); + TEST_ASSERT(run->exit_reason == KVM_EXIT_SHUTDOWN, + "Exit_reason other than KVM_EXIT_SHUTDOWN: %u (%s)\n", + run->exit_reason, + exit_reason_str(run->exit_reason)); +} + +int main(int argc, char *argv[]) +{ + struct kvm_vm *vm; + struct kvm_run *state; + int rv; + uint64_t msr_platform_info; + + /* Tell stdout not to buffer its content */ + setbuf(stdout, NULL); + + rv = kvm_check_cap(KVM_CAP_MSR_PLATFORM_INFO); + if (!rv) { + fprintf(stderr, + "KVM_CAP_MSR_PLATFORM_INFO not supported, skip test\n"); + exit(KSFT_SKIP); + } + + vm = vm_create_default(VCPU_ID, guest_code); + + msr_platform_info = vcpu_get_msr(vm, VCPU_ID, MSR_PLATFORM_INFO); + vcpu_set_msr(vm, VCPU_ID, MSR_PLATFORM_INFO, + msr_platform_info | MSR_PLATFORM_INFO_MAX_TURBO_RATIO); + test_msr_platform_info_disabled(vm); + test_msr_platform_info_enabled(vm); + vcpu_set_msr(vm, VCPU_ID, MSR_PLATFORM_INFO, msr_platform_info); + + kvm_vm_free(vm); + + return 0; +}