]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/bugs: Decouple ALTERNATIVE usage from VERW macro definition
authorSean Christopherson <seanjc@google.com>
Thu, 13 Nov 2025 23:37:40 +0000 (15:37 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 19 Nov 2025 00:22:41 +0000 (16:22 -0800)
Decouple the use of ALTERNATIVE from the encoding of VERW to clear CPU
buffers so that KVM can use ALTERNATIVE_2 to handle "always clear buffers"
and "clear if guest can access host MMIO" in a single statement.

No functional change intended.

Reviewed-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Link: https://patch.msgid.link/20251113233746.1703361-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/nospec-branch.h

index 08ed5a2e46a5fd790bcb1b73feb6469518809c06..cb36a8ea00d337919dcd3adad097d05a2c0520b5 100644 (file)
  * CFLAGS.ZF.
  * Note: Only the memory operand variant of VERW clears the CPU buffers.
  */
-.macro __CLEAR_CPU_BUFFERS feature
 #ifdef CONFIG_X86_64
-       ALTERNATIVE "", "verw x86_verw_sel(%rip)", \feature
+#define VERW   verw x86_verw_sel(%rip)
 #else
-       /*
-        * In 32bit mode, the memory operand must be a %cs reference. The data
-        * segments may not be usable (vm86 mode), and the stack segment may not
-        * be flat (ESPFIX32).
-        */
-       ALTERNATIVE "", "verw %cs:x86_verw_sel", \feature
+/*
+ * In 32bit mode, the memory operand must be a %cs reference. The data segments
+ * may not be usable (vm86 mode), and the stack segment may not be flat (ESPFIX32).
+ */
+#define VERW   verw %cs:x86_verw_sel
 #endif
-.endm
 
+/*
+ * Provide a stringified VERW macro for simple usage, and a non-stringified
+ * VERW macro for use in more elaborate sequences, e.g. to encode a conditional
+ * VERW within an ALTERNATIVE.
+ */
+#define __CLEAR_CPU_BUFFERS    __stringify(VERW)
+
+/* If necessary, emit VERW on exit-to-userspace to clear CPU buffers. */
 #define CLEAR_CPU_BUFFERS \
-       __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF
+       ALTERNATIVE "", __CLEAR_CPU_BUFFERS, X86_FEATURE_CLEAR_CPU_BUF
 
 #define VM_CLEAR_CPU_BUFFERS \
-       __CLEAR_CPU_BUFFERS X86_FEATURE_CLEAR_CPU_BUF_VM
+       ALTERNATIVE "", __CLEAR_CPU_BUFFERS, X86_FEATURE_CLEAR_CPU_BUF_VM
 
 #ifdef CONFIG_X86_64
 .macro CLEAR_BRANCH_HISTORY