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