Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2246922imm; Thu, 7 Jun 2018 07:39:37 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJD8y0XKgZy/JvBP3WneK9FhCcqFw7Y6fQTxGL70zZq2fhbA1piBfaKBRfyuWXw9/wlx8c+ X-Received: by 2002:a62:e816:: with SMTP id c22-v6mr2055044pfi.124.1528382377143; Thu, 07 Jun 2018 07:39:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528382377; cv=none; d=google.com; s=arc-20160816; b=ypXMBexyVOAAYSpnM+Tnu3aIgLvRYBHxSr4CIYh7vu8dLPbvqbk/lG0Rev8RUpOzVP GQn7uxWnwM/smVwaxDcERHBypAOqBWae2tct14ODQ7+OIf5VCZBqW8iEAbVzAmjkYFWx tZshK1kPrJ7+Q96U7D9j+ygBfDN4VvmCAyOAAFfhYlz2bG8mjzn1LHEjsk63jR0CXwjm YYeTI4LKbkYMlQIc/HwspPGSB6w3LBsIJ81lFinbb59qUKFvx3oxpgfQCICkHMVHWZcs QMmEPQ8SIOTfk/5ntVsDmL+Xwgt+UmQJzO5OA5sPGALjnlM73w0uYLU/ynj4jwRWyFN7 KOHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition :arc-authentication-results; bh=GTIGcfaz/uPgCVjhCSnfeqSf4abkYiClgnGTWAqtkL4=; b=0aBY41KQiPDy7xpXnfi5z2nrs3XtoQUzPiyKKVSjkTQhXAjWShnsPzNg0BWSGngmqO ECZ/gnQaAebmI2ZRhC0QfOyCxemEGgLmZOFKTY7TXDv3jK4/Hp1H/1htkXY4y2sxImWZ eyS9BBZdWi9XvOgptalgShCr4xNaedMwdNOfzZoRXiu+aigX3khEjkPJPF50dxXfhlpv /fryYGdUwIZWOKp9S1WaxFf9nbQsYyLxD5w8PWPhVzlmzDNjiU7xk1/nA/RZmw3JmeKP iegjOI5nWDy8ul30tju47Hdoq89MeETZQ3x/qUfas3MGlZ7nkuj1HE2KVuA1kh+Z8BcP dBgA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 22-v6si15023409pfh.308.2018.06.07.07.39.22; Thu, 07 Jun 2018 07:39:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934215AbeFGOiU (ORCPT + 99 others); Thu, 7 Jun 2018 10:38:20 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:40466 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934180AbeFGOiB (ORCPT ); Thu, 7 Jun 2018 10:38:01 -0400 Received: from [148.252.241.226] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1fQvbw-0005Zp-Vh; Thu, 07 Jun 2018 15:09:57 +0100 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1fQvaz-0002kd-A2; Thu, 07 Jun 2018 15:08:57 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, kvm@vger.kernel.org, "KarimAllah Ahmed" , "Linus Torvalds" , "Thomas Gleixner" , "Konrad Rzeszutek Wilk" , "Andi Kleen" , "Andy Lutomirski" , "Arjan Van De Ven" , "Darren Kenny" , "Dan Williams" , "Dave Hansen" , "Jim Mattson" , "Jun Nakajima" , "Andrea Arcangeli" , "David Woodhouse" , "Ashok Raj" , "Asit Mallick" , "Greg KH" , "Paolo Bonzini" , "Tim Chen" Date: Thu, 07 Jun 2018 15:05:21 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) Subject: [PATCH 3.16 056/410] KVM/VMX: Emulate MSR_IA32_ARCH_CAPABILITIES In-Reply-To: X-SA-Exim-Connect-IP: 148.252.241.226 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.57-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: KarimAllah Ahmed commit 28c1c9fabf48d6ad596273a11c46e0d0da3e14cd upstream. Intel processors use MSR_IA32_ARCH_CAPABILITIES MSR to indicate RDCL_NO (bit 0) and IBRS_ALL (bit 1). This is a read-only MSR. By default the contents will come directly from the hardware, but user-space can still override it. [dwmw2: The bit in kvm_cpuid_7_0_edx_x86_features can be unconditional] Signed-off-by: KarimAllah Ahmed Signed-off-by: David Woodhouse Signed-off-by: Thomas Gleixner Reviewed-by: Paolo Bonzini Reviewed-by: Darren Kenny Reviewed-by: Jim Mattson Reviewed-by: Konrad Rzeszutek Wilk Cc: Andrea Arcangeli Cc: Andi Kleen Cc: Jun Nakajima Cc: kvm@vger.kernel.org Cc: Dave Hansen Cc: Linus Torvalds Cc: Andy Lutomirski Cc: Asit Mallick Cc: Arjan Van De Ven Cc: Greg KH Cc: Dan Williams Cc: Tim Chen Cc: Ashok Raj Link: https://lkml.kernel.org/r/1517522386-18410-4-git-send-email-karahmed@amazon.de Signed-off-by: David Woodhouse Signed-off-by: Greg Kroah-Hartman [bwh: Backported to 3.16: - Add mapping of the relevant CPUID word - Adjust context] Signed-off-by: Ben Hutchings --- arch/x86/kvm/cpuid.c | 11 +++++++++-- arch/x86/kvm/cpuid.h | 8 ++++++++ arch/x86/kvm/vmx.c | 15 +++++++++++++++ arch/x86/kvm/x86.c | 3 ++- 4 files changed, 34 insertions(+), 3 deletions(-) --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -316,6 +316,10 @@ static inline int __do_cpuid_ent(struct F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) | F(ADX) | F(SMAP); + /* cpuid 7.0.edx*/ + const u32 kvm_cpuid_7_0_edx_x86_features = + F(ARCH_CAPABILITIES); + /* all calls to cpuid_count() should be made on the same cpu */ get_cpu(); @@ -387,11 +391,14 @@ static inline int __do_cpuid_ent(struct cpuid_mask(&entry->ebx, 9); // TSC_ADJUST is emulated entry->ebx |= F(TSC_ADJUST); - } else + entry->edx &= kvm_cpuid_7_0_edx_x86_features; + cpuid_mask(&entry->edx, 10); + } else { entry->ebx = 0; + entry->edx = 0; + } entry->eax = 0; entry->ecx = 0; - entry->edx = 0; break; } case 9: --- a/arch/x86/kvm/cpuid.h +++ b/arch/x86/kvm/cpuid.h @@ -115,5 +115,13 @@ static inline bool guest_cpuid_has_ibpb( return best && (best->edx & bit(X86_FEATURE_SPEC_CTRL)); } +static inline bool guest_cpuid_has_arch_capabilities(struct kvm_vcpu *vcpu) +{ + struct kvm_cpuid_entry2 *best; + + best = kvm_find_cpuid_entry(vcpu, 7, 0); + return best && (best->edx & bit(X86_FEATURE_ARCH_CAPABILITIES)); +} + #endif --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -432,6 +432,8 @@ struct vcpu_vmx { u64 msr_guest_kernel_gs_base; #endif + u64 arch_capabilities; + u32 vm_entry_controls_shadow; u32 vm_exit_controls_shadow; /* @@ -2522,6 +2524,12 @@ static int vmx_get_msr(struct kvm_vcpu * case MSR_IA32_TSC: msr_info->data = guest_read_tsc(); break; + case MSR_IA32_ARCH_CAPABILITIES: + if (!msr_info->host_initiated && + !guest_cpuid_has_arch_capabilities(vcpu)) + return 1; + msr_info->data = to_vmx(vcpu)->arch_capabilities; + break; case MSR_IA32_SYSENTER_CS: msr_info->data = vmcs_read32(GUEST_SYSENTER_CS); break; @@ -2641,6 +2649,11 @@ static int vmx_set_msr(struct kvm_vcpu * vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD, MSR_TYPE_W); break; + case MSR_IA32_ARCH_CAPABILITIES: + if (!msr_info->host_initiated) + return 1; + vmx->arch_capabilities = data; + break; case MSR_IA32_CR_PAT: if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data)) @@ -4584,6 +4597,8 @@ static int vmx_vcpu_setup(struct vcpu_vm ++vmx->nmsrs; } + if (boot_cpu_has(X86_FEATURE_ARCH_CAPABILITIES)) + rdmsrl(MSR_IA32_ARCH_CAPABILITIES, vmx->arch_capabilities); vm_exit_controls_init(vmx, vmcs_config.vmexit_ctrl); --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -893,7 +893,8 @@ static u32 msrs_to_save[] = { MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, #endif MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA, - MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS + MSR_IA32_FEATURE_CONTROL, MSR_IA32_BNDCFGS, + MSR_IA32_ARCH_CAPABILITIES }; static unsigned num_msrs_to_save;