x86/cpufeatures: Add {REQUIRED,DISABLED} feature configs
authorH. Peter Anvin (Intel) <hpa@zytor.com>
Fri, 28 Feb 2025 08:23:35 +0000 (00:23 -0800)
committerIngo Molnar <mingo@kernel.org>
Wed, 19 Mar 2025 10:15:11 +0000 (11:15 +0100)
Required and disabled feature masks completely rely on build configs,
i.e., once a build config is fixed, so are the feature masks.

To prepare for auto-generating the <asm/cpufeaturemasks.h> header
with required and disabled feature masks based on a build config,
add feature Kconfig items:

  - X86_REQUIRED_FEATURE_x
  - X86_DISABLED_FEATURE_x

each of which may be set to "y" if and only if its preconditions from
current build config are met.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20250228082338.73859-3-xin@zytor.com
arch/x86/Kconfig
arch/x86/Kconfig.cpufeatures [new file with mode: 0644]

index ddef35248def607ff90d95fd44ed85ef2ad387ac..98bd4935280c68a838b4a4aeebe3b3a0878591ef 100644 (file)
@@ -3130,4 +3130,6 @@ config HAVE_ATOMIC_IOMAP
 
 source "arch/x86/kvm/Kconfig"
 
+source "arch/x86/Kconfig.cpufeatures"
+
 source "arch/x86/Kconfig.assembler"
diff --git a/arch/x86/Kconfig.cpufeatures b/arch/x86/Kconfig.cpufeatures
new file mode 100644 (file)
index 0000000..e12d5b7
--- /dev/null
@@ -0,0 +1,201 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# x86 feature bits (see arch/x86/include/asm/cpufeatures.h) that are
+# either REQUIRED to be enabled, or DISABLED (always ignored) for this
+# particular compile-time configuration.  The tests for these features
+# are turned into compile-time constants via the generated
+# <asm/cpufeaturemasks.h>.
+#
+# The naming of these variables *must* match asm/cpufeatures.h, e.g.,
+#     X86_FEATURE_ALWAYS <==> X86_REQUIRED_FEATURE_ALWAYS
+#     X86_FEATURE_FRED   <==> X86_DISABLED_FEATURE_FRED
+#
+# And these REQUIRED and DISABLED config options are manipulated in an
+# AWK script as the following example:
+#
+#                          +----------------------+
+#                          |    X86_FRED = y ?    |
+#                          +----------------------+
+#                              /             \
+#                           Y /               \ N
+#  +-------------------------------------+   +-------------------------------+
+#  | X86_DISABLED_FEATURE_FRED undefined |   | X86_DISABLED_FEATURE_FRED = y |
+#  +-------------------------------------+   +-------------------------------+
+#                                                        |
+#                                                        |
+#     +-------------------------------------------+      |
+#     | X86_FEATURE_FRED: feature word 12, bit 17 | ---->|
+#     +-------------------------------------------+      |
+#                                                        |
+#                                                        |
+#                                     +-------------------------------+
+#                                     | set bit 17 of DISABLED_MASK12 |
+#                                     +-------------------------------+
+#
+
+config X86_REQUIRED_FEATURE_ALWAYS
+       def_bool y
+
+config X86_REQUIRED_FEATURE_NOPL
+       def_bool y
+       depends on X86_64 || X86_P6_NOP
+
+config X86_REQUIRED_FEATURE_CX8
+       def_bool y
+       depends on X86_CX8
+
+# this should be set for all -march=.. options where the compiler
+# generates cmov.
+config X86_REQUIRED_FEATURE_CMOV
+       def_bool y
+       depends on X86_CMOV
+
+# this should be set for all -march= options where the compiler
+# generates movbe.
+config X86_REQUIRED_FEATURE_MOVBE
+       def_bool y
+       depends on MATOM
+
+config X86_REQUIRED_FEATURE_CPUID
+       def_bool y
+       depends on X86_64
+
+config X86_REQUIRED_FEATURE_UP
+       def_bool y
+       depends on !SMP
+
+config X86_REQUIRED_FEATURE_FPU
+       def_bool y
+       depends on !MATH_EMULATION
+
+config X86_REQUIRED_FEATURE_PAE
+       def_bool y
+       depends on X86_64 || X86_PAE
+
+config X86_REQUIRED_FEATURE_PSE
+       def_bool y
+       depends on X86_64 && !PARAVIRT_XXL
+
+config X86_REQUIRED_FEATURE_PGE
+       def_bool y
+       depends on X86_64 && !PARAVIRT_XXL
+
+config X86_REQUIRED_FEATURE_MSR
+       def_bool y
+       depends on X86_64
+
+config X86_REQUIRED_FEATURE_FXSR
+       def_bool y
+       depends on X86_64
+
+config X86_REQUIRED_FEATURE_XMM
+       def_bool y
+       depends on X86_64
+
+config X86_REQUIRED_FEATURE_XMM2
+       def_bool y
+       depends on X86_64
+
+config X86_REQUIRED_FEATURE_LM
+       def_bool y
+       depends on X86_64
+
+config X86_DISABLED_FEATURE_UMIP
+       def_bool y
+       depends on !X86_UMIP
+
+config X86_DISABLED_FEATURE_VME
+       def_bool y
+       depends on X86_64
+
+config X86_DISABLED_FEATURE_K6_MTRR
+       def_bool y
+       depends on X86_64
+
+config X86_DISABLED_FEATURE_CYRIX_ARR
+       def_bool y
+       depends on X86_64
+
+config X86_DISABLED_FEATURE_CENTAUR_MCR
+       def_bool y
+       depends on X86_64
+
+config X86_DISABLED_FEATURE_PCID
+       def_bool y
+       depends on !X86_64
+
+config X86_DISABLED_FEATURE_PKU
+       def_bool y
+       depends on !X86_INTEL_MEMORY_PROTECTION_KEYS
+
+config X86_DISABLED_FEATURE_OSPKE
+       def_bool y
+       depends on !X86_INTEL_MEMORY_PROTECTION_KEYS
+
+config X86_DISABLED_FEATURE_LA57
+       def_bool y
+       depends on !X86_5LEVEL
+
+config X86_DISABLED_FEATURE_PTI
+       def_bool y
+       depends on !MITIGATION_PAGE_TABLE_ISOLATION
+
+config X86_DISABLED_FEATURE_RETPOLINE
+       def_bool y
+       depends on !MITIGATION_RETPOLINE
+
+config X86_DISABLED_FEATURE_RETPOLINE_LFENCE
+       def_bool y
+       depends on !MITIGATION_RETPOLINE
+
+config X86_DISABLED_FEATURE_RETHUNK
+       def_bool y
+       depends on !MITIGATION_RETHUNK
+
+config X86_DISABLED_FEATURE_UNRET
+       def_bool y
+       depends on !MITIGATION_UNRET_ENTRY
+
+config X86_DISABLED_FEATURE_CALL_DEPTH
+       def_bool y
+       depends on !MITIGATION_CALL_DEPTH_TRACKING
+
+config X86_DISABLED_FEATURE_LAM
+       def_bool y
+       depends on !ADDRESS_MASKING
+
+config X86_DISABLED_FEATURE_ENQCMD
+       def_bool y
+       depends on !INTEL_IOMMU_SVM
+
+config X86_DISABLED_FEATURE_SGX
+       def_bool y
+       depends on !X86_SGX
+
+config X86_DISABLED_FEATURE_XENPV
+       def_bool y
+       depends on !XEN_PV
+
+config X86_DISABLED_FEATURE_TDX_GUEST
+       def_bool y
+       depends on !INTEL_TDX_GUEST
+
+config X86_DISABLED_FEATURE_USER_SHSTK
+       def_bool y
+       depends on !X86_USER_SHADOW_STACK
+
+config X86_DISABLED_FEATURE_IBT
+       def_bool y
+       depends on !X86_KERNEL_IBT
+
+config X86_DISABLED_FEATURE_FRED
+       def_bool y
+       depends on !X86_FRED
+
+config X86_DISABLED_FEATURE_SEV_SNP
+       def_bool y
+       depends on !KVM_AMD_SEV
+
+config X86_DISABLED_FEATURE_INVLPGB
+       def_bool y
+       depends on !BROADCAST_TLB_FLUSH