Received: by 10.223.176.5 with SMTP id f5csp3287728wra; Mon, 29 Jan 2018 11:20:44 -0800 (PST) X-Google-Smtp-Source: AH8x224xtSKMAT3T30sg91Tu7ORXdmJrCKOXBqxCKr+D0FIwzsVlzHSWIxz/4gv3AwMDhjCMNgRw X-Received: by 10.101.77.68 with SMTP id j4mr23083248pgt.222.1517253644361; Mon, 29 Jan 2018 11:20:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517253644; cv=none; d=google.com; s=arc-20160816; b=gmMwc0KVzpL3ET2neKh+czvxkZURmCWFpvoh0SOUo2lM3dCEJh+uJcR5efdwLiTEwU 7ZlrimP0oSB7rFp0sU2EYPC+SytJ2ilZXBcCDzumViLqP1ZppZ12wC1qHuFQ1Yo/2Zqw 0t+DjeXuAi+enJT+xJCttrv8fPG++b+JKPmBHxO0EoOOyCN/Zajmws4yeNS4w26S5BQe V6NEe111Ov1GYekzoAC/dxK32gJPrA2UWQhGmW9ilAQTMBuKcZj95YQvoDRFHeZ5oIuQ uJcz5ewtj3JyvXXNJ6ZQpQzueG1w3t49WVPk6G4j5F9AQw4vWXT8Q8IdY08ID/SSxGcY IBrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=uAd+dVAblsfh+PNwiB7A8FGkeObBh0elsRirbD/SwIw=; b=AQghtgGaoQWE2eqd1b61cvhBrHlrLOJLbc9h2q1lnIKiV5sCO3Q2znWnRH/jRVnJ0H hpHqSRqYGoPFa94l23bBxGeY8M9PSbyxRPqthz63lPsiBUh5zIEeas5Ox1UpEkkVuy0J 9c702w8Ob3KhnCa5os97TO5wvdZAGiXTQV6QWLE9kbAyhjLW7gI/7ZsPe3+Xymy+h47e 0spHXk/geaGzI/QuMkzZhU6BVv4G76dnhNMrJfGZ29ePJHjKvAIQqv0EfsOlGtIUexaV hwHtGrstwQzxhHPeQyaYOHdlA0X7qAySTVxXLIT80enUvTPlYKR1ALjphRO8qgH7MeXv UwgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=a45fXMBB; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g8si7878671pgr.797.2018.01.29.11.20.28; Mon, 29 Jan 2018 11:20:44 -0800 (PST) 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; dkim=pass header.i=@google.com header.s=20161025 header.b=a45fXMBB; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751448AbeA2TTe (ORCPT + 99 others); Mon, 29 Jan 2018 14:19:34 -0500 Received: from mail-io0-f196.google.com ([209.85.223.196]:36945 "EHLO mail-io0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751262AbeA2TTc (ORCPT ); Mon, 29 Jan 2018 14:19:32 -0500 Received: by mail-io0-f196.google.com with SMTP id f89so8804353ioj.4 for ; Mon, 29 Jan 2018 11:19:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=uAd+dVAblsfh+PNwiB7A8FGkeObBh0elsRirbD/SwIw=; b=a45fXMBBHC1mBPOpo2rmiDUK8eUhvpeY8wPcVdqySSinkr+iVjZmvHbpt61nWmsfKk DP9Nmxs0f95R7IAz+a9x51yLvj1V7vEcPiI/E6MvfAshST6vErOLN3mSLs9eCyo8YKka PttxYfSNU3eddU10Md//t3DfzX/UVu8eCytCDejRLSOzAy03OkPy9DiWIJrKjo7Xv+TU L51x47fA7xSw4NnAaDO7mI1cjq5AO6mTIYQPgrm38GGxgkb+qp0dwKSCSIdpD+8CWYs/ AVDIHZ3MTrUTbHoD/3OX4Xak00x2hsoASORV7TzleMYXiHw5sDY6LMrqfL6WSGbGyryx sshQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=uAd+dVAblsfh+PNwiB7A8FGkeObBh0elsRirbD/SwIw=; b=B/ONJoJQHSJ8qETy05q53/SA8Ne8mfxsBD9Fl44JB59I1zrTTMvwXjJ7t1p1NzzsZf /NKIWssNrcSaKCnhYQH/77r2uFw3vUTULOI+rxXdI1aDJMcTm8UII7lkS4K1ellrTq+x bqvnueSGioOwOZUesKTxok1LUfI03uwYOlbd7Vu6f29cjHQppYDCoinCyZEO8J03kgTf SGkEAlllR8DYXPw8BYu+q+rfEGj7mWCN1zZhG5X4vGtZYxDtkgtqFr0jemzjvpHdfhHO EkSGfUajCql1Kn+f3Hqd228LaCsneJJMgb8tozVVRmrIFOWNbfjv5OxfTTBM/MPVEiDZ t9nA== X-Gm-Message-State: AKwxyte52oj2mxaWAp+Sq5yPFBZWnqBwearWXdrqRq+5zLqrI/cXffPa lD5cBl2+TkBty+M9CvC6eHpDeB2af1I3mjIhMkG2Hx6fiTxy6g== X-Received: by 10.107.53.150 with SMTP id k22mr12640623ioo.285.1517253571181; Mon, 29 Jan 2018 11:19:31 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.128.7 with HTTP; Mon, 29 Jan 2018 11:19:30 -0800 (PST) In-Reply-To: <1517187532-32286-4-git-send-email-karahmed@amazon.de> References: <1517187532-32286-1-git-send-email-karahmed@amazon.de> <1517187532-32286-4-git-send-email-karahmed@amazon.de> From: Jim Mattson Date: Mon, 29 Jan 2018 11:19:30 -0800 Message-ID: Subject: Re: [PATCH v2 3/4] x86/kvm: Add IBPB support To: KarimAllah Ahmed Cc: kvm list , LKML , "the arch/x86 maintainers" , Ashok Raj , Asit Mallick , Dave Hansen , Arjan Van De Ven , Tim Chen , Linus Torvalds , Andrea Arcangeli , Andi Kleen , Thomas Gleixner , Dan Williams , Jun Nakajima , Andy Lutomirski , Greg KH , Paolo Bonzini , Peter Zijlstra , David Woodhouse Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jan 28, 2018 at 4:58 PM, KarimAllah Ahmed wrote: > From: Ashok Raj > > Add MSR passthrough for MSR_IA32_PRED_CMD and place branch predictor > barriers on switching between VMs to avoid inter VM Spectre-v2 attacks. > > [peterz: rebase and changelog rewrite] > [karahmed: - rebase > - vmx: expose PRED_CMD whenever it is available > - svm: only pass through IBPB if it is available] > Cc: Asit Mallick > Cc: Dave Hansen > Cc: Arjan Van De Ven > Cc: Tim Chen > Cc: Linus Torvalds > Cc: Andrea Arcangeli > Cc: Andi Kleen > Cc: Thomas Gleixner > Cc: Dan Williams > Cc: Jun Nakajima > Cc: Andy Lutomirski > Cc: Greg KH > Cc: Paolo Bonzini > Signed-off-by: Ashok Raj > Signed-off-by: Peter Zijlstra (Intel) > Link: http://lkml.kernel.org/r/1515720739-43819-6-git-send-email-ashok.raj@intel.com > Signed-off-by: David Woodhouse > Signed-off-by: KarimAllah Ahmed > --- > arch/x86/kvm/svm.c | 14 ++++++++++++++ > arch/x86/kvm/vmx.c | 4 ++++ > 2 files changed, 18 insertions(+) > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 2744b973..c886e46 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -529,6 +529,7 @@ struct svm_cpu_data { > struct kvm_ldttss_desc *tss_desc; > > struct page *save_area; > + struct vmcb *current_vmcb; > }; > > static DEFINE_PER_CPU(struct svm_cpu_data *, svm_data); > @@ -918,6 +919,9 @@ static void svm_vcpu_init_msrpm(u32 *msrpm) > > set_msr_interception(msrpm, direct_access_msrs[i].index, 1, 1); > } > + > + if (boot_cpu_has(X86_FEATURE_IBPB)) > + set_msr_interception(msrpm, MSR_IA32_PRED_CMD, 1, 1); What if the guest doesn't have X86_FEATURE_IBPB? > } > > static void add_msr_offset(u32 offset) > @@ -1706,11 +1710,17 @@ static void svm_free_vcpu(struct kvm_vcpu *vcpu) > __free_pages(virt_to_page(svm->nested.msrpm), MSRPM_ALLOC_ORDER); > kvm_vcpu_uninit(vcpu); > kmem_cache_free(kvm_vcpu_cache, svm); > + /* > + * The vmcb page can be recycled, causing a false negative in > + * svm_vcpu_load(). So do a full IBPB now. > + */ > + indirect_branch_prediction_barrier(); > } > > static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > { > struct vcpu_svm *svm = to_svm(vcpu); > + struct svm_cpu_data *sd = per_cpu(svm_data, cpu); > int i; > > if (unlikely(cpu != vcpu->cpu)) { > @@ -1739,6 +1749,10 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > if (static_cpu_has(X86_FEATURE_RDTSCP)) > wrmsrl(MSR_TSC_AUX, svm->tsc_aux); > > + if (sd->current_vmcb != svm->vmcb) { > + sd->current_vmcb = svm->vmcb; > + indirect_branch_prediction_barrier(); > + } > avic_vcpu_load(vcpu, cpu); > } > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index dac564d..f82a44c 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -2296,6 +2296,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > if (per_cpu(current_vmcs, cpu) != vmx->loaded_vmcs->vmcs) { > per_cpu(current_vmcs, cpu) = vmx->loaded_vmcs->vmcs; > vmcs_load(vmx->loaded_vmcs->vmcs); > + indirect_branch_prediction_barrier(); > } > > if (!already_loaded) { > @@ -9613,6 +9614,9 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id) > goto free_msrs; > > msr_bitmap = vmx->vmcs01.msr_bitmap; > + > + if (boot_cpu_has(X86_FEATURE_IBPB)) > + vmx_disable_intercept_for_msr(msr_bitmap, MSR_IA32_PRED_CMD, MSR_TYPE_RW); What if the guest doesn't have X86_FEATURE_IBPB? > vmx_disable_intercept_for_msr(msr_bitmap, MSR_FS_BASE, MSR_TYPE_RW); > vmx_disable_intercept_for_msr(msr_bitmap, MSR_GS_BASE, MSR_TYPE_RW); > vmx_disable_intercept_for_msr(msr_bitmap, MSR_KERNEL_GS_BASE, MSR_TYPE_RW); > -- > 2.7.4 >