Nikolay Borisov 128b31
From: "David P. Reed" <dpreed@deepplum.com>
Nikolay Borisov 128b31
Date: Wed, 30 Dec 2020 16:26:56 -0800
Nikolay Borisov 128b31
Subject: x86/virt: Mark flags and memory as clobbered by VMXOFF
Nikolay Borisov 128b31
Git-commit: 53666664a3052e4ea3ddcb183460dfbc30f1d056
Nikolay Borisov 128b31
Patch-mainline: v5.12-rc1
Nikolay Borisov 128b31
References: git-fixes
Nikolay Borisov 128b31
Nikolay Borisov 128b31
Explicitly tell the compiler that VMXOFF modifies flags (like all VMX
Nikolay Borisov 128b31
instructions), and mark memory as clobbered since VMXOFF must not be
Nikolay Borisov 128b31
reordered and also may have memory side effects (though the kernel
Nikolay Borisov 128b31
really shouldn't be accessing the root VMCS anyways).
Nikolay Borisov 128b31
Nikolay Borisov 128b31
Practically speaking, adding the clobbers is most likely a nop; the
Nikolay Borisov 128b31
primary motivation is to properly document VMXOFF's behavior.
Nikolay Borisov 128b31
Nikolay Borisov 128b31
For the flags clobber, both Clang and GCC automatically mark flags as
Nikolay Borisov 128b31
clobbered; this is noted in commit 4b1e54786e48 ("KVM/x86: Use assembly
Nikolay Borisov 128b31
instruction mnemonics instead of .byte streams"), which intentionally
Nikolay Borisov 128b31
removed the previous clobber.  But, neither Clang nor GCC documents
Nikolay Borisov 128b31
this behavior, and there's no downside to including the clobber.
Nikolay Borisov 128b31
Nikolay Borisov 128b31
For the memory clobber, the RFLAGS.IF and CR4.VMXE manipulations that
Nikolay Borisov 128b31
immediately follow VMXOFF have compiler barriers of their own, i.e.
Nikolay Borisov 128b31
VMXOFF can't get reordered after clearing CR4.VMXE, which is really
Nikolay Borisov 128b31
what's of interest.
Nikolay Borisov 128b31
Nikolay Borisov 128b31
Cc: Randy Dunlap <rdunlap@infradead.org>
Nikolay Borisov 128b31
Signed-off-by: David P. Reed <dpreed@deepplum.com>
Nikolay Borisov 128b31
[sean: rewrote changelog, dropped comment adjustments]
Nikolay Borisov 128b31
Signed-off-by: Sean Christopherson <seanjc@google.com>
Nikolay Borisov 128b31
Message-Id: <20201231002702.2223707-4-seanjc@google.com>
Nikolay Borisov 128b31
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Nikolay Borisov 128b31
Acked-by: Nikolay Borisov <nik.borisov@suse.com>
Nikolay Borisov 128b31
---
Nikolay Borisov 128b31
 arch/x86/include/asm/virtext.h | 3 ++-
Nikolay Borisov 128b31
 1 file changed, 2 insertions(+), 1 deletion(-)
Nikolay Borisov 128b31
Nikolay Borisov 128b31
diff --git a/arch/x86/include/asm/virtext.h b/arch/x86/include/asm/virtext.h
Nikolay Borisov 128b31
index fda3e7747c22..2cc585467667 100644
Nikolay Borisov 128b31
--- a/arch/x86/include/asm/virtext.h
Nikolay Borisov 128b31
+++ b/arch/x86/include/asm/virtext.h
Nikolay Borisov 128b31
@@ -44,7 +44,8 @@ static inline int cpu_has_vmx(void)
Nikolay Borisov 128b31
 static inline void cpu_vmxoff(void)
Nikolay Borisov 128b31
 {
Nikolay Borisov 128b31
 	asm_volatile_goto("1: vmxoff\n\t"
Nikolay Borisov 128b31
-			  _ASM_EXTABLE(1b, %l[fault]) :::: fault);
Nikolay Borisov 128b31
+			  _ASM_EXTABLE(1b, %l[fault])
Nikolay Borisov 128b31
+			  ::: "cc", "memory" : fault);
Nikolay Borisov 128b31
 fault:
Nikolay Borisov 128b31
 	cr4_clear_bits(X86_CR4_VMXE);
Nikolay Borisov 128b31
 }
Nikolay Borisov 128b31