Received: by 2002:a05:7412:251c:b0:e2:908c:2ebd with SMTP id w28csp1280269rda; Mon, 23 Oct 2023 07:59:31 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH4Xr4l1OlW6JSsvSUHkUJK/YU533OzzKROe6zu6eH1JxNc9tYKvmddVuqLk4FHDJyXKbrg X-Received: by 2002:a05:6359:6291:b0:168:df94:3376 with SMTP id se17-20020a056359629100b00168df943376mr2678012rwb.7.1698073171474; Mon, 23 Oct 2023 07:59:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698073171; cv=none; d=google.com; s=arc-20160816; b=AFSFEq9d4r+9YQFbL+/2LvCRXZBOXXf08+WJMA+Un4q+bPibxbOKPDJhm3k2qP44w6 vQwaEnbMaKCqtmPeNGzs1ocF5broAKMyx+TaquD+3zXWNTC/gnLwRaWk8BBFTnFzPi6H 9mFSm0LpaVvzqUyG1jv/M9II3smdpDorW9PRsdz+nj7+UeHzjkI83VX9Cn1wNnqCpjwi u7H6c7AK6Qz6kCdcT6Vk4OHG9iE/pw3/vy2MZ/EUdNAgXTgDYg4YdXBHWLn6oVmGFelq wOR4KkGwDlC2QWj9PGO59woQKfcQtcX7xDTIF9Nm60SdwvzopRDchOBw3QMZStcz8Ja1 fqKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=Flyl5CTmQl8KaVZkUK6sdZJgLtZ9cPBOArwvlq8mdTY=; fh=SyxcvViqygumIva4yJbQoxy7Vq6BRqnWLLPsvZppLLU=; b=AIRJz7J8PmPDHNQ4cqVCtnQVmpIUEqIAktX9OUM5etrQJxoKzc4sCtgHBau16ZCVd3 Yf0bY3uHCbvRqDujjGSfZKpXqUsl7SvUc6QIdFZ1B8Jzxe5Kw9PoSDpYtLWaFAz9Hh0H EQz2JHx35h3RtDojWB0z+HMI1dJzBZXWFHHM0Fq31cmtjmOPODenOfUII/CDl8fGk10m SE7v+bmPDpE7o3WOolnIQy9BIG5s7ByG++0jts0HDLwQ4Q5MrOzQJOTcqDQ8jHAJU9J6 WK35cOzK9wUkKMa7q7uOeGYyYVR3htQBo/epqRCvB4N4/l718SZMF8v2Z2hBk4GmGhjR oUYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=t0gaFMfr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 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 pete.vger.email (pete.vger.email. [2620:137:e000::3:6]) by mx.google.com with ESMTPS id j187-20020a638bc4000000b00578e5228c76si6571772pge.505.2023.10.23.07.59.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Oct 2023 07:59:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) client-ip=2620:137:e000::3:6; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=t0gaFMfr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id 46C42807972D; Mon, 23 Oct 2023 07:59:28 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231575AbjJWO7Q (ORCPT + 99 others); Mon, 23 Oct 2023 10:59:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59982 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230255AbjJWO7F (ORCPT ); Mon, 23 Oct 2023 10:59:05 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 49D1610D0 for ; Mon, 23 Oct 2023 07:59:00 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5a7ba10cb90so48591897b3.3 for ; Mon, 23 Oct 2023 07:59:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1698073139; x=1698677939; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Flyl5CTmQl8KaVZkUK6sdZJgLtZ9cPBOArwvlq8mdTY=; b=t0gaFMfr57X0eZU/lKCOhS/MG0/yy4xukxJRgkMFu1dU3h1QAl3Hjok2/wiupLIXLx EDKpOn7TWuBxUs4Wzhp+iGTEi9jgvf/z73zho1P6eH65gSgaX0a7CgfCl3FzrwJrsfOK NrMMR6nnrN5K1r+hDVCGTaakmQ/7m/EGmzcZR8IQpc1xMPHORO8aXyuaVfVI53k5OvR5 ywIKdAEi5VE4fTvhiI71jXgtwU4DfaSypmUp5T6uRl2QgdiYMFyfv+Tdx4vtEowfi/Jc 1ov32QAlIcBPbEvLpyQSRwuh9POidgx4MiBMs4xAj5eE0LfRjemvY6P/oZK1JJ7aocDP 15hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698073139; x=1698677939; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Flyl5CTmQl8KaVZkUK6sdZJgLtZ9cPBOArwvlq8mdTY=; b=J9zjlFRLWVQ/TPE2Ywfz0IupzPrBDTjM2AhN8mFZtMH7aZK6YftuZXVkly4Un96Uyp HMcwfpXjj46VMz3xPxjD3x6MP9tXMkWnEdW748i9reRvNB6pNowzBgKpfmePx8TdAnL9 IfsqDWD/bMR2k2L7pCTwYlyP4cyiE+JILGsihDszP9umkQonTzHlc1kGI8cbTZhrQ04M geiyV+oKhrkevpB8fw3M7nmLSAWAY5lSSep4bEts04FHiooKiDZSBuYScX5tJ49Wrr/X 1TTSmM1KThiC9rEpCxZc029daTRFUxKegePI0UHiXaLtLf2VTTxn+qi/pkwV+6tf89l5 KRWA== X-Gm-Message-State: AOJu0Yz7FvB/oeo2vZHtQf5MdZw5+YTyaWvPRdCnF+5zmQsJT9RVXYW8 p2NAW2+9Tr1pI/lSgm+0jgidvK4VJcc= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:b97:0:b0:d7b:94f5:1301 with SMTP id 145-20020a250b97000000b00d7b94f51301mr168980ybl.9.1698073139445; Mon, 23 Oct 2023 07:58:59 -0700 (PDT) Date: Mon, 23 Oct 2023 07:58:57 -0700 In-Reply-To: <20231021004633.ymughma7zijosku5@desk> Mime-Version: 1.0 References: <20231020-delay-verw-v1-0-cff54096326d@linux.intel.com> <20231020-delay-verw-v1-6-cff54096326d@linux.intel.com> <20231021004633.ymughma7zijosku5@desk> Message-ID: Subject: Re: [PATCH 6/6] KVM: VMX: Move VERW closer to VMentry for MDS mitigation From: Sean Christopherson To: Pawan Gupta Cc: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Peter Zijlstra , Josh Poimboeuf , Andy Lutomirski , Jonathan Corbet , Paolo Bonzini , tony.luck@intel.com, ak@linux.intel.com, tim.c.chen@linux.intel.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kvm@vger.kernel.org, Alyssa Milburn , Daniel Sneddon , antonio.gomez.iglesias@linux.intel.com Content-Type: text/plain; charset="us-ascii" X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Mon, 23 Oct 2023 07:59:28 -0700 (PDT) On Fri, Oct 20, 2023, Pawan Gupta wrote: > On Fri, Oct 20, 2023 at 03:55:07PM -0700, Sean Christopherson wrote: > > On Fri, Oct 20, 2023, Pawan Gupta wrote: > > > During VMentry VERW is executed to mitigate MDS. After VERW, any memory > > > access like register push onto stack may put host data in MDS affected > > > CPU buffers. A guest can then use MDS to sample host data. > > > > > > Although likelihood of secrets surviving in registers at current VERW > > > callsite is less, but it can't be ruled out. Harden the MDS mitigation > > > by moving the VERW mitigation late in VMentry path. > > > > > > Note that VERW for MMIO Stale Data mitigation is unchanged because of > > > the complexity of per-guest conditional VERW which is not easy to handle > > > that late in asm with no GPRs available. If the CPU is also affected by > > > MDS, VERW is unconditionally executed late in asm regardless of guest > > > having MMIO access. > > > > > > Signed-off-by: Pawan Gupta > > > --- > > > arch/x86/kvm/vmx/vmenter.S | 9 +++++++++ > > > arch/x86/kvm/vmx/vmx.c | 10 +++++++--- > > > 2 files changed, 16 insertions(+), 3 deletions(-) > > > > > > diff --git a/arch/x86/kvm/vmx/vmenter.S b/arch/x86/kvm/vmx/vmenter.S > > > index be275a0410a8..efa716cf4727 100644 > > > --- a/arch/x86/kvm/vmx/vmenter.S > > > +++ b/arch/x86/kvm/vmx/vmenter.S > > > @@ -1,6 +1,7 @@ > > > /* SPDX-License-Identifier: GPL-2.0 */ > > > #include > > > #include > > > +#include > > > #include > > > #include > > > #include > > > @@ -31,6 +32,8 @@ > > > #define VCPU_R15 __VCPU_REGS_R15 * WORD_SIZE > > > #endif > > > > > > +#define GUEST_CLEAR_CPU_BUFFERS USER_CLEAR_CPU_BUFFERS > > > + > > > .macro VMX_DO_EVENT_IRQOFF call_insn call_target > > > /* > > > * Unconditionally create a stack frame, getting the correct RSP on the > > > @@ -177,10 +180,16 @@ SYM_FUNC_START(__vmx_vcpu_run) > > > * the 'vmx_vmexit' label below. > > > */ > > > .Lvmresume: > > > + /* Mitigate CPU data sampling attacks .e.g. MDS */ > > > + GUEST_CLEAR_CPU_BUFFERS > > > > I have a very hard time believing that it's worth duplicating the mitigation > > for VMRESUME vs. VMLAUNCH just to land it after a Jcc. > > VERW modifies the flags, so it either needs to be after Jcc or we > push/pop flags that adds 2 extra memory operations. Please let me know > if there is a better option. Ugh, I assumed that piggybacking VERW overrode the original behavior entirely, I didn't realize it sacrifices EFLAGS.ZF on the altar of mitigations. Luckily, this is easy to solve now that VMRESUME vs. VMLAUNCH uses a flag instead of a dedicated bool. From: Sean Christopherson Date: Mon, 23 Oct 2023 07:44:35 -0700 Subject: [PATCH] KVM: VMX: Use BT+JNC, i.e. EFLAGS.CF to select VMRESUME vs. VMLAUNCH Use EFLAGS.CF instead of EFLAGS.ZF to track whether to use VMRESUME versus VMLAUNCH. Freeing up EFLAGS.ZF will allow doing VERW, which clobbers ZF, for MDS mitigations as late as possible without needing to duplicate VERW for both paths. Signed-off-by: Sean Christopherson --- arch/x86/kvm/vmx/run_flags.h | 7 +++++-- arch/x86/kvm/vmx/vmenter.S | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/vmx/run_flags.h b/arch/x86/kvm/vmx/run_flags.h index edc3f16cc189..6a9bfdfbb6e5 100644 --- a/arch/x86/kvm/vmx/run_flags.h +++ b/arch/x86/kvm/vmx/run_flags.h @@ -2,7 +2,10 @@ #ifndef __KVM_X86_VMX_RUN_FLAGS_H #define __KVM_X86_VMX_RUN_FLAGS_H -#define VMX_RUN_VMRESUME (1 << 0) -#define VMX_RUN_SAVE_SPEC_CTRL (1 << 1) +#define VMX_RUN_VMRESUME_SHIFT 0 +#define VMX_RUN_SAVE_SPEC_CTRL_SHIFT 1 + +#define VMX_RUN_VMRESUME BIT(VMX_RUN_VMRESUME_SHIFT) +#define VMX_RUN_SAVE_SPEC_CTRL BIT(VMX_RUN_SAVE_SPEC_CTRL_SHIFT) #endif /* __KVM_X86_VMX_RUN_FLAGS_H */ diff --git a/arch/x86/kvm/vmx/vmenter.S b/arch/x86/kvm/vmx/vmenter.S index be275a0410a8..b3b13ec04bac 100644 --- a/arch/x86/kvm/vmx/vmenter.S +++ b/arch/x86/kvm/vmx/vmenter.S @@ -139,7 +139,7 @@ SYM_FUNC_START(__vmx_vcpu_run) mov (%_ASM_SP), %_ASM_AX /* Check if vmlaunch or vmresume is needed */ - test $VMX_RUN_VMRESUME, %ebx + bt $VMX_RUN_VMRESUME_SHIFT, %ebx /* Load guest registers. Don't clobber flags. */ mov VCPU_RCX(%_ASM_AX), %_ASM_CX @@ -161,8 +161,8 @@ SYM_FUNC_START(__vmx_vcpu_run) /* Load guest RAX. This kills the @regs pointer! */ mov VCPU_RAX(%_ASM_AX), %_ASM_AX - /* Check EFLAGS.ZF from 'test VMX_RUN_VMRESUME' above */ - jz .Lvmlaunch + /* Check EFLAGS.CF from the VMX_RUN_VMRESUME bit test above. */ + jnc .Lvmlaunch /* * After a successful VMRESUME/VMLAUNCH, control flow "magically" base-commit: ec2f1daad460c6201338dae606466220ccaa96d5 --