|
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 |
|