* [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks
@ 2025-02-28 8:23 Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 1/5] x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8 Xin Li (Intel)
` (5 more replies)
0 siblings, 6 replies; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
The x86 build process first generates required and disabled feature
masks based on current build config, and then uses these generated
masks to compile the source code. When a CPU feature is not enabled
in a build config, e.g., when CONFIG_X86_FRED=n, its feature disable
flag, i.e., DISABLE_FRED, needs to be properly defined and added to
a specific disabled CPU features mask in <asm/disabled-features.h>,
as the following patch does:
https://lore.kernel.org/all/20231205105030.8698-8-xin3.li@intel.com/.
As a result, the FRED feature bit is surely cleared in the generated
kernel binary when CONFIG_X86_FRED=n.
Recently there is another case to repeat the same exercise for the
AMD SEV-SNP CPU feature:
https://lore.kernel.org/all/20240126041126.1927228-2-michael.roth@amd.com/.
https://lore.kernel.org/all/20240126041126.1927228-23-michael.roth@amd.com/.
It was one thing when there were four of CPU feature masks, but with
over 20 it is going to cause mistakes, e.g.,
https://lore.kernel.org/lkml/aaed79d5-d683-d1bc-7ba1-b33c8d6db618@suse.com/.
We want to eliminate the stupidly repeated exercise to manually assign
features to CPU feature words through introducing an AWK script to
automatically generate a header with required and disabled CPU feature
masks based on current build config, and this patch set does that.
Link to v5:
https://lore.kernel.org/lkml/20250106070727.3211006-1-xin@zytor.com/
H. Peter Anvin (Intel) (3):
x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8
x86/cpufeatures: Add {required,disabled} feature configs
x86/cpufeatures: Generate a feature mask header based on build config
Xin Li (Intel) (2):
x86/cpufeatures: Remove {disabled,required}-features.h
x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET
arch/x86/Kconfig | 4 +-
arch/x86/Kconfig.cpu | 4 +-
arch/x86/Kconfig.cpufeatures | 197 ++++++++++++++++++
arch/x86/Makefile | 17 +-
arch/x86/boot/cpucheck.c | 3 +-
arch/x86/boot/cpuflags.c | 1 -
arch/x86/boot/mkcpustr.c | 3 +-
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/asm-prototypes.h | 2 +-
arch/x86/include/asm/atomic64_32.h | 2 +-
arch/x86/include/asm/cmpxchg_32.h | 2 +-
arch/x86/include/asm/cpufeature.h | 70 +------
arch/x86/include/asm/cpufeatures.h | 8 -
arch/x86/include/asm/disabled-features.h | 161 --------------
arch/x86/include/asm/required-features.h | 105 ----------
arch/x86/kernel/verify_cpu.S | 4 +
arch/x86/lib/Makefile | 2 +-
arch/x86/lib/cmpxchg8b_emu.S | 2 +-
arch/x86/tools/featuremasks.awk | 88 ++++++++
lib/atomic64_test.c | 2 +-
tools/arch/x86/include/asm/cpufeatures.h | 8 -
.../arch/x86/include/asm/disabled-features.h | 161 --------------
.../arch/x86/include/asm/required-features.h | 105 ----------
tools/perf/check-headers.sh | 2 -
24 files changed, 320 insertions(+), 634 deletions(-)
create mode 100644 arch/x86/Kconfig.cpufeatures
delete mode 100644 arch/x86/include/asm/disabled-features.h
delete mode 100644 arch/x86/include/asm/required-features.h
create mode 100755 arch/x86/tools/featuremasks.awk
delete mode 100644 tools/arch/x86/include/asm/disabled-features.h
delete mode 100644 tools/arch/x86/include/asm/required-features.h
base-commit: 0b8c04b9207d5ee92ab3b341f0211aaf2c0b6976
--
2.48.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v6 1/5] x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
@ 2025-02-28 8:23 ` Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 2/5] x86/cpufeatures: Add {required,disabled} feature configs Xin Li (Intel)
` (4 subsequent siblings)
5 siblings, 0 replies; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Replace X86_CMPXCHG64 with X86_CX8, as CX8 is the name of the CPUID
flag, thus to make it consistent with X86_FEATURE_CX8 defined in
<asm/cpufeatures.h>.
No functional change intended.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
---
Change in v6:
* Rename X86_CMPXCHG64 in a separate patch (Borislav Petkov).
---
arch/x86/Kconfig | 2 +-
arch/x86/Kconfig.cpu | 4 ++--
arch/x86/include/asm/asm-prototypes.h | 2 +-
arch/x86/include/asm/atomic64_32.h | 2 +-
arch/x86/include/asm/cmpxchg_32.h | 2 +-
arch/x86/include/asm/required-features.h | 2 +-
arch/x86/lib/Makefile | 2 +-
arch/x86/lib/cmpxchg8b_emu.S | 2 +-
lib/atomic64_test.c | 2 +-
tools/arch/x86/include/asm/required-features.h | 2 +-
10 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 60c2a16c7801..1e50da06ffc4 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -133,7 +133,7 @@ config X86
select ARCH_SUPPORTS_AUTOFDO_CLANG
select ARCH_SUPPORTS_PROPELLER_CLANG if X86_64
select ARCH_USE_BUILTIN_BSWAP
- select ARCH_USE_CMPXCHG_LOCKREF if X86_CMPXCHG64
+ select ARCH_USE_CMPXCHG_LOCKREF if X86_CX8
select ARCH_USE_MEMTEST
select ARCH_USE_QUEUED_RWLOCKS
select ARCH_USE_QUEUED_SPINLOCKS
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
index 8fcb8ccee44b..f8b3296fe2e1 100644
--- a/arch/x86/Kconfig.cpu
+++ b/arch/x86/Kconfig.cpu
@@ -299,7 +299,7 @@ config X86_HAVE_PAE
def_bool y
depends on MCRUSOE || MEFFICEON || MCYRIXIII || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC7 || MATOM || X86_64
-config X86_CMPXCHG64
+config X86_CX8
def_bool y
depends on X86_HAVE_PAE || M586TSC || M586MMX || MK6 || MK7 || MGEODEGX1 || MGEODE_LX
@@ -313,7 +313,7 @@ config X86_MINIMUM_CPU_FAMILY
int
default "64" if X86_64
default "6" if X86_32 && (MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MATOM || MK7)
- default "5" if X86_32 && X86_CMPXCHG64
+ default "5" if X86_32 && X86_CX8
default "4"
config X86_DEBUGCTLMSR
diff --git a/arch/x86/include/asm/asm-prototypes.h b/arch/x86/include/asm/asm-prototypes.h
index 3674006e3974..8d9e62725202 100644
--- a/arch/x86/include/asm/asm-prototypes.h
+++ b/arch/x86/include/asm/asm-prototypes.h
@@ -16,7 +16,7 @@
#include <asm/gsseg.h>
#include <asm/nospec-branch.h>
-#ifndef CONFIG_X86_CMPXCHG64
+#ifndef CONFIG_X86_CX8
extern void cmpxchg8b_emu(void);
#endif
diff --git a/arch/x86/include/asm/atomic64_32.h b/arch/x86/include/asm/atomic64_32.h
index 6c6e9b9f98a4..797085ecaaa4 100644
--- a/arch/x86/include/asm/atomic64_32.h
+++ b/arch/x86/include/asm/atomic64_32.h
@@ -48,7 +48,7 @@ static __always_inline s64 arch_atomic64_read_nonatomic(const atomic64_t *v)
ATOMIC64_EXPORT(atomic64_##sym)
#endif
-#ifdef CONFIG_X86_CMPXCHG64
+#ifdef CONFIG_X86_CX8
#define __alternative_atomic64(f, g, out, in...) \
asm volatile("call %c[func]" \
: ALT_OUTPUT_SP(out) \
diff --git a/arch/x86/include/asm/cmpxchg_32.h b/arch/x86/include/asm/cmpxchg_32.h
index 95b5f990ca88..ee89fbc4dd4b 100644
--- a/arch/x86/include/asm/cmpxchg_32.h
+++ b/arch/x86/include/asm/cmpxchg_32.h
@@ -69,7 +69,7 @@ static __always_inline bool __try_cmpxchg64_local(volatile u64 *ptr, u64 *oldp,
return __arch_try_cmpxchg64(ptr, oldp, new,);
}
-#ifdef CONFIG_X86_CMPXCHG64
+#ifdef CONFIG_X86_CX8
#define arch_cmpxchg64 __cmpxchg64
diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h
index e9187ddd3d1f..0068133cb622 100644
--- a/arch/x86/include/asm/required-features.h
+++ b/arch/x86/include/asm/required-features.h
@@ -23,7 +23,7 @@
# define NEED_PAE 0
#endif
-#ifdef CONFIG_X86_CMPXCHG64
+#ifdef CONFIG_X86_CX8
# define NEED_CX8 (1<<(X86_FEATURE_CX8 & 31))
#else
# define NEED_CX8 0
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index f453507649d4..64ccecedc9f8 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -56,7 +56,7 @@ ifeq ($(CONFIG_X86_32),y)
lib-y += string_32.o
lib-y += memmove_32.o
lib-y += cmpxchg8b_emu.o
-ifneq ($(CONFIG_X86_CMPXCHG64),y)
+ifneq ($(CONFIG_X86_CX8),y)
lib-y += atomic64_386_32.o
endif
else
diff --git a/arch/x86/lib/cmpxchg8b_emu.S b/arch/x86/lib/cmpxchg8b_emu.S
index 1c96be769adc..d4bb24347ff8 100644
--- a/arch/x86/lib/cmpxchg8b_emu.S
+++ b/arch/x86/lib/cmpxchg8b_emu.S
@@ -7,7 +7,7 @@
.text
-#ifndef CONFIG_X86_CMPXCHG64
+#ifndef CONFIG_X86_CX8
/*
* Emulate 'cmpxchg8b (%esi)' on UP
diff --git a/lib/atomic64_test.c b/lib/atomic64_test.c
index 759ea1783cc5..d726068358c7 100644
--- a/lib/atomic64_test.c
+++ b/lib/atomic64_test.c
@@ -254,7 +254,7 @@ static __init int test_atomics_init(void)
pr_info("passed for %s platform %s CX8 and %s SSE\n",
#ifdef CONFIG_X86_64
"x86-64",
-#elif defined(CONFIG_X86_CMPXCHG64)
+#elif defined(CONFIG_X86_CX8)
"i586+",
#else
"i386+",
diff --git a/tools/arch/x86/include/asm/required-features.h b/tools/arch/x86/include/asm/required-features.h
index e9187ddd3d1f..0068133cb622 100644
--- a/tools/arch/x86/include/asm/required-features.h
+++ b/tools/arch/x86/include/asm/required-features.h
@@ -23,7 +23,7 @@
# define NEED_PAE 0
#endif
-#ifdef CONFIG_X86_CMPXCHG64
+#ifdef CONFIG_X86_CX8
# define NEED_CX8 (1<<(X86_FEATURE_CX8 & 31))
#else
# define NEED_CX8 0
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v6 2/5] x86/cpufeatures: Add {required,disabled} feature configs
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 1/5] x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8 Xin Li (Intel)
@ 2025-02-28 8:23 ` Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config Xin Li (Intel)
` (3 subsequent siblings)
5 siblings, 0 replies; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
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 a 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>
---
Changes in v6:
* Move changes to X86_CMPXCHG64 to a separate patch (Borislav Petkov).
* Keep X86_{CX8,CMOV} and define X86_REQUIRED_FEATURE_{CX8,CMOV} on top
(Borislav Petkov).
Changes in v2:
* Keep the X86_{REQUIRED,DISABLED}_FEATURE_ prefixes solely in
arch/x86/Kconfig.cpufeatures (Borislav Petkov).
* Explain how config option names X86_{REQUIRED,DISABLED}_FEATURE_<name>
are formed (Borislav Petkov).
---
arch/x86/Kconfig | 2 +
arch/x86/Kconfig.cpufeatures | 197 +++++++++++++++++++++++++++++++++++
2 files changed, 199 insertions(+)
create mode 100644 arch/x86/Kconfig.cpufeatures
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 1e50da06ffc4..1b12725cac8c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -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
index 000000000000..5dcc49d928c5
--- /dev/null
+++ b/arch/x86/Kconfig.cpufeatures
@@ -0,0 +1,197 @@
+# 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/featuremasks.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
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 1/5] x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8 Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 2/5] x86/cpufeatures: Add {required,disabled} feature configs Xin Li (Intel)
@ 2025-02-28 8:23 ` Xin Li (Intel)
2025-03-03 11:38 ` Aithal, Srikanth
2025-02-28 8:23 ` [PATCH v6 4/5] x86/cpufeatures: Remove {disabled,required}-features.h Xin Li (Intel)
` (2 subsequent siblings)
5 siblings, 1 reply; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Introduce an AWK script to auto-generate a header with required and
disabled feature masks based on <asm/cpufeatures.h> and current build
config. Thus for any CPU feature with a build config, e.g., X86_FRED,
simply add
config X86_DISABLED_FEATURE_FRED
def_bool y
depends on !X86_FRED
to arch/x86/Kconfig.cpufeatures, instead of adding a conditional CPU
feature disable flag, e.g., DISABLE_FRED.
Lastly the generated required and disabled feature masks will be added
to their corresponding feature masks for this particular compile-time
configuration.
[ Xin: build integration improvements ]
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
---
Change in v6:
* Make the AWK script work for mawk and BusyBox awk (Borislav Petkov).
Change in v5:
* More polishes (Nikolay Borisov).
Changes in v4:
* Add a few high-level comments to the AWK script (Nikolay Borisov).
* Enforce CPU feature mask values to be unsigned.
Changes in v3:
* Remove AWK code that generates extra debugging comments (Brian Gerst).
* Move SSE_MASK to verify_cpu.S, the only place it is used (Brian Gerst).
Change in v2:
* Remove code generating unused macros {REQUIRED,DISABLED}_FEATURE(x)
to tell if a CPU feature, e.g., X86_FEATURE_FRED, is a required or
disabled feature for this particular compile-time configuration.
---
arch/x86/Makefile | 17 ++++++-
arch/x86/boot/cpucheck.c | 3 +-
arch/x86/boot/cpuflags.c | 1 -
arch/x86/boot/mkcpustr.c | 3 +-
arch/x86/include/asm/Kbuild | 1 +
arch/x86/include/asm/cpufeature.h | 1 +
arch/x86/include/asm/cpufeatures.h | 8 ---
arch/x86/kernel/verify_cpu.S | 4 ++
arch/x86/tools/featuremasks.awk | 81 ++++++++++++++++++++++++++++++
9 files changed, 105 insertions(+), 14 deletions(-)
create mode 100755 arch/x86/tools/featuremasks.awk
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 6784129328f6..60583987d320 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -263,9 +263,22 @@ archscripts: scripts_basic
$(Q)$(MAKE) $(build)=arch/x86/tools relocs
###
-# Syscall table generation
+# Feature masks header and syscall table generation
-archheaders:
+out := arch/x86/include/generated/asm
+featuremasks_hdr := featuremasks.h
+featuremasks_awk := $(srctree)/arch/x86/tools/featuremasks.awk
+cpufeatures_hdr := $(srctree)/arch/x86/include/asm/cpufeatures.h
+quiet_cmd_gen_featuremasks = GEN $@
+ cmd_gen_featuremasks = $(AWK) -f $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) > $@
+
+$(out)/$(featuremasks_hdr): $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) FORCE
+ $(shell mkdir -p $(out))
+ $(call if_changed,gen_featuremasks)
+
+targets += $(out)/$(featuremasks_hdr)
+
+archheaders: $(out)/$(featuremasks_hdr)
$(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
###
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
index 0aae4d4ed615..8d03a741d1b2 100644
--- a/arch/x86/boot/cpucheck.c
+++ b/arch/x86/boot/cpucheck.c
@@ -22,10 +22,11 @@
# include "boot.h"
#endif
#include <linux/types.h>
+#include <asm/featuremasks.h>
#include <asm/intel-family.h>
#include <asm/processor-flags.h>
-#include <asm/required-features.h>
#include <asm/msr-index.h>
+
#include "string.h"
#include "msr.h"
diff --git a/arch/x86/boot/cpuflags.c b/arch/x86/boot/cpuflags.c
index d75237ba7ce9..0cabdacb2a2f 100644
--- a/arch/x86/boot/cpuflags.c
+++ b/arch/x86/boot/cpuflags.c
@@ -3,7 +3,6 @@
#include "bitops.h"
#include <asm/processor-flags.h>
-#include <asm/required-features.h>
#include <asm/msr-index.h>
#include "cpuflags.h"
diff --git a/arch/x86/boot/mkcpustr.c b/arch/x86/boot/mkcpustr.c
index da0ccc5de538..b90110109675 100644
--- a/arch/x86/boot/mkcpustr.c
+++ b/arch/x86/boot/mkcpustr.c
@@ -12,8 +12,6 @@
#include <stdio.h>
-#include "../include/asm/required-features.h"
-#include "../include/asm/disabled-features.h"
#include "../include/asm/cpufeatures.h"
#include "../include/asm/vmxfeatures.h"
#include "../kernel/cpu/capflags.c"
@@ -23,6 +21,7 @@ int main(void)
int i, j;
const char *str;
+ printf("#include <asm/featuremasks.h>\n\n");
printf("static const char x86_cap_strs[] =\n");
for (i = 0; i < NCAPINTS; i++) {
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild
index 58f4ddecc5fa..51022d21003e 100644
--- a/arch/x86/include/asm/Kbuild
+++ b/arch/x86/include/asm/Kbuild
@@ -8,6 +8,7 @@ generated-y += syscalls_x32.h
generated-y += unistd_32_ia32.h
generated-y += unistd_64_x32.h
generated-y += xen-hypercalls.h
+generated-y += featuremasks.h
generic-y += early_ioremap.h
generic-y += fprobe.h
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index de1ad09fe8d7..077a5bbd1cc5 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -9,6 +9,7 @@
#include <asm/asm.h>
#include <linux/bitops.h>
#include <asm/alternative.h>
+#include <asm/featuremasks.h>
enum cpuid_leafs
{
diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index c8701abb7752..b9b7329f4ac4 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -2,14 +2,6 @@
#ifndef _ASM_X86_CPUFEATURES_H
#define _ASM_X86_CPUFEATURES_H
-#ifndef _ASM_X86_REQUIRED_FEATURES_H
-#include <asm/required-features.h>
-#endif
-
-#ifndef _ASM_X86_DISABLED_FEATURES_H
-#include <asm/disabled-features.h>
-#endif
-
/*
* Defines x86 CPU feature bits
*/
diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S
index 1258a5872d12..a23a65d5d177 100644
--- a/arch/x86/kernel/verify_cpu.S
+++ b/arch/x86/kernel/verify_cpu.S
@@ -29,8 +29,12 @@
*/
#include <asm/cpufeatures.h>
+#include <asm/featuremasks.h>
#include <asm/msr-index.h>
+#define SSE_MASK \
+ (REQUIRED_MASK0 & ((1<<(X86_FEATURE_XMM & 31)) | (1<<(X86_FEATURE_XMM2 & 31))))
+
SYM_FUNC_START_LOCAL(verify_cpu)
pushf # Save caller passed flags
push $0 # Kill any dangerous flags
diff --git a/arch/x86/tools/featuremasks.awk b/arch/x86/tools/featuremasks.awk
new file mode 100755
index 000000000000..fd3e72147157
--- /dev/null
+++ b/arch/x86/tools/featuremasks.awk
@@ -0,0 +1,81 @@
+#!/usr/bin/awk
+#
+# Convert cpufeatures.h to a list of compile-time masks
+# Note: this blithly assumes that each word has at least one
+# feature defined in it; if not, something else is wrong!
+#
+
+BEGIN {
+ printf "#ifndef _ASM_X86_FEATUREMASKS_H\n";
+ printf "#define _ASM_X86_FEATUREMASKS_H\n\n";
+
+ file = 0
+}
+
+FNR == 1 {
+ ++file;
+
+ # arch/x86/include/asm/cpufeatures.h
+ if (file == 1)
+ FS = "[ \t()*+]+";
+
+ # .config
+ if (file == 2)
+ FS = "=";
+}
+
+# Create a dictionary of sorts, containing all defined feature bits
+file == 1 && $1 ~ /^#define$/ && $2 ~ /^X86_FEATURE_/ {
+ nfeat = $3 * $4 + $5;
+ feat = $2;
+ sub(/^X86_FEATURE_/, "", feat);
+ feats[nfeat] = feat;
+}
+file == 1 && $1 ~ /^#define$/ && $2 == "NCAPINTS" {
+ ncapints = int($3);
+}
+
+# Create a dictionary featstat[REQUIRED|DISABLED, FEATURE_NAME] = on | off
+file == 2 && $1 ~ /^CONFIG_X86_(REQUIRED|DISABLED)_FEATURE_/ {
+ on = ($2 == "y");
+ if (split($1, fs, "CONFIG_X86_|_FEATURE_") == 3)
+ featstat[fs[2], fs[3]] = on;
+}
+
+END {
+ sets[1] = "REQUIRED";
+ sets[2] = "DISABLED";
+
+ for (ns in sets) {
+ s = sets[ns];
+
+ printf "/*\n";
+ printf " * %s features:\n", s;
+ printf " *\n";
+ fstr = "";
+ for (i = 0; i < ncapints; i++) {
+ mask = 0;
+ for (j = 0; j < 32; j++) {
+ feat = feats[i*32 + j];
+ if (featstat[s, feat]) {
+ nfstr = fstr " " feat;
+ if (length(nfstr) > 72) {
+ printf " * %s\n", fstr;
+ nfstr = " " feat;
+ }
+ fstr = nfstr;
+ mask += (2 ^ j);
+ }
+ }
+ masks[i] = mask;
+ }
+ printf " * %s\n */\n", fstr;
+
+ for (i = 0; i < ncapints; i++)
+ printf "#define %s_MASK%d\t0x%08xU\n", s, i, masks[i];
+
+ printf "#define %s_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != %d)\n\n", s, ncapints;
+ }
+
+ printf "#endif /* _ASM_X86_FEATUREMASKS_H */\n";
+}
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v6 4/5] x86/cpufeatures: Remove {disabled,required}-features.h
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
` (2 preceding siblings ...)
2025-02-28 8:23 ` [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config Xin Li (Intel)
@ 2025-02-28 8:23 ` Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 5/5] x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET Xin Li (Intel)
2025-02-28 9:26 ` [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Ingo Molnar
5 siblings, 0 replies; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
The functionalities of {disabled,required}-features.h are replaced
with the auto-generated header cpufeature_masks.h. Thus they are no
longer needed. So delete them.
None of the macros defined in {disabled,required}-features.h is used
in tools, delete them too.
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
---
arch/x86/include/asm/disabled-features.h | 161 ------------------
arch/x86/include/asm/required-features.h | 105 ------------
tools/arch/x86/include/asm/cpufeatures.h | 8 -
.../arch/x86/include/asm/disabled-features.h | 161 ------------------
.../arch/x86/include/asm/required-features.h | 105 ------------
| 2 -
6 files changed, 542 deletions(-)
delete mode 100644 arch/x86/include/asm/disabled-features.h
delete mode 100644 arch/x86/include/asm/required-features.h
delete mode 100644 tools/arch/x86/include/asm/disabled-features.h
delete mode 100644 tools/arch/x86/include/asm/required-features.h
diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h
deleted file mode 100644
index c492bdc97b05..000000000000
--- a/arch/x86/include/asm/disabled-features.h
+++ /dev/null
@@ -1,161 +0,0 @@
-#ifndef _ASM_X86_DISABLED_FEATURES_H
-#define _ASM_X86_DISABLED_FEATURES_H
-
-/* These features, although they might be available in a CPU
- * will not be used because the compile options to support
- * them are not present.
- *
- * This code allows them to be checked and disabled at
- * compile time without an explicit #ifdef. Use
- * cpu_feature_enabled().
- */
-
-#ifdef CONFIG_X86_UMIP
-# define DISABLE_UMIP 0
-#else
-# define DISABLE_UMIP (1<<(X86_FEATURE_UMIP & 31))
-#endif
-
-#ifdef CONFIG_X86_64
-# define DISABLE_VME (1<<(X86_FEATURE_VME & 31))
-# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))
-# define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31))
-# define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31))
-# define DISABLE_PCID 0
-#else
-# define DISABLE_VME 0
-# define DISABLE_K6_MTRR 0
-# define DISABLE_CYRIX_ARR 0
-# define DISABLE_CENTAUR_MCR 0
-# define DISABLE_PCID (1<<(X86_FEATURE_PCID & 31))
-#endif /* CONFIG_X86_64 */
-
-#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
-# define DISABLE_PKU 0
-# define DISABLE_OSPKE 0
-#else
-# define DISABLE_PKU (1<<(X86_FEATURE_PKU & 31))
-# define DISABLE_OSPKE (1<<(X86_FEATURE_OSPKE & 31))
-#endif /* CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS */
-
-#ifdef CONFIG_X86_5LEVEL
-# define DISABLE_LA57 0
-#else
-# define DISABLE_LA57 (1<<(X86_FEATURE_LA57 & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION
-# define DISABLE_PTI 0
-#else
-# define DISABLE_PTI (1 << (X86_FEATURE_PTI & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_RETPOLINE
-# define DISABLE_RETPOLINE 0
-#else
-# define DISABLE_RETPOLINE ((1 << (X86_FEATURE_RETPOLINE & 31)) | \
- (1 << (X86_FEATURE_RETPOLINE_LFENCE & 31)))
-#endif
-
-#ifdef CONFIG_MITIGATION_RETHUNK
-# define DISABLE_RETHUNK 0
-#else
-# define DISABLE_RETHUNK (1 << (X86_FEATURE_RETHUNK & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_UNRET_ENTRY
-# define DISABLE_UNRET 0
-#else
-# define DISABLE_UNRET (1 << (X86_FEATURE_UNRET & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_CALL_DEPTH_TRACKING
-# define DISABLE_CALL_DEPTH_TRACKING 0
-#else
-# define DISABLE_CALL_DEPTH_TRACKING (1 << (X86_FEATURE_CALL_DEPTH & 31))
-#endif
-
-#ifdef CONFIG_ADDRESS_MASKING
-# define DISABLE_LAM 0
-#else
-# define DISABLE_LAM (1 << (X86_FEATURE_LAM & 31))
-#endif
-
-#ifdef CONFIG_INTEL_IOMMU_SVM
-# define DISABLE_ENQCMD 0
-#else
-# define DISABLE_ENQCMD (1 << (X86_FEATURE_ENQCMD & 31))
-#endif
-
-#ifdef CONFIG_X86_SGX
-# define DISABLE_SGX 0
-#else
-# define DISABLE_SGX (1 << (X86_FEATURE_SGX & 31))
-#endif
-
-#ifdef CONFIG_XEN_PV
-# define DISABLE_XENPV 0
-#else
-# define DISABLE_XENPV (1 << (X86_FEATURE_XENPV & 31))
-#endif
-
-#ifdef CONFIG_INTEL_TDX_GUEST
-# define DISABLE_TDX_GUEST 0
-#else
-# define DISABLE_TDX_GUEST (1 << (X86_FEATURE_TDX_GUEST & 31))
-#endif
-
-#ifdef CONFIG_X86_USER_SHADOW_STACK
-#define DISABLE_USER_SHSTK 0
-#else
-#define DISABLE_USER_SHSTK (1 << (X86_FEATURE_USER_SHSTK & 31))
-#endif
-
-#ifdef CONFIG_X86_KERNEL_IBT
-#define DISABLE_IBT 0
-#else
-#define DISABLE_IBT (1 << (X86_FEATURE_IBT & 31))
-#endif
-
-#ifdef CONFIG_X86_FRED
-# define DISABLE_FRED 0
-#else
-# define DISABLE_FRED (1 << (X86_FEATURE_FRED & 31))
-#endif
-
-#ifdef CONFIG_KVM_AMD_SEV
-#define DISABLE_SEV_SNP 0
-#else
-#define DISABLE_SEV_SNP (1 << (X86_FEATURE_SEV_SNP & 31))
-#endif
-
-/*
- * Make sure to add features to the correct mask
- */
-#define DISABLED_MASK0 (DISABLE_VME)
-#define DISABLED_MASK1 0
-#define DISABLED_MASK2 0
-#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR)
-#define DISABLED_MASK4 (DISABLE_PCID)
-#define DISABLED_MASK5 0
-#define DISABLED_MASK6 0
-#define DISABLED_MASK7 (DISABLE_PTI)
-#define DISABLED_MASK8 (DISABLE_XENPV|DISABLE_TDX_GUEST)
-#define DISABLED_MASK9 (DISABLE_SGX)
-#define DISABLED_MASK10 0
-#define DISABLED_MASK11 (DISABLE_RETPOLINE|DISABLE_RETHUNK|DISABLE_UNRET| \
- DISABLE_CALL_DEPTH_TRACKING|DISABLE_USER_SHSTK)
-#define DISABLED_MASK12 (DISABLE_FRED|DISABLE_LAM)
-#define DISABLED_MASK13 0
-#define DISABLED_MASK14 0
-#define DISABLED_MASK15 0
-#define DISABLED_MASK16 (DISABLE_PKU|DISABLE_OSPKE|DISABLE_LA57|DISABLE_UMIP| \
- DISABLE_ENQCMD)
-#define DISABLED_MASK17 0
-#define DISABLED_MASK18 (DISABLE_IBT)
-#define DISABLED_MASK19 (DISABLE_SEV_SNP)
-#define DISABLED_MASK20 0
-#define DISABLED_MASK21 0
-#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)
-
-#endif /* _ASM_X86_DISABLED_FEATURES_H */
diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h
deleted file mode 100644
index 0068133cb622..000000000000
--- a/arch/x86/include/asm/required-features.h
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef _ASM_X86_REQUIRED_FEATURES_H
-#define _ASM_X86_REQUIRED_FEATURES_H
-
-/* Define minimum CPUID feature set for kernel These bits are checked
- really early to actually display a visible error message before the
- kernel dies. Make sure to assign features to the proper mask!
-
- Some requirements that are not in CPUID yet are also in the
- CONFIG_X86_MINIMUM_CPU_FAMILY which is checked too.
-
- The real information is in arch/x86/Kconfig.cpu, this just converts
- the CONFIGs into a bitmask */
-
-#ifndef CONFIG_MATH_EMULATION
-# define NEED_FPU (1<<(X86_FEATURE_FPU & 31))
-#else
-# define NEED_FPU 0
-#endif
-
-#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
-# define NEED_PAE (1<<(X86_FEATURE_PAE & 31))
-#else
-# define NEED_PAE 0
-#endif
-
-#ifdef CONFIG_X86_CX8
-# define NEED_CX8 (1<<(X86_FEATURE_CX8 & 31))
-#else
-# define NEED_CX8 0
-#endif
-
-#if defined(CONFIG_X86_CMOV) || defined(CONFIG_X86_64)
-# define NEED_CMOV (1<<(X86_FEATURE_CMOV & 31))
-#else
-# define NEED_CMOV 0
-#endif
-
-# define NEED_3DNOW 0
-
-#if defined(CONFIG_X86_P6_NOP) || defined(CONFIG_X86_64)
-# define NEED_NOPL (1<<(X86_FEATURE_NOPL & 31))
-#else
-# define NEED_NOPL 0
-#endif
-
-#ifdef CONFIG_MATOM
-# define NEED_MOVBE (1<<(X86_FEATURE_MOVBE & 31))
-#else
-# define NEED_MOVBE 0
-#endif
-
-#ifdef CONFIG_X86_64
-#ifdef CONFIG_PARAVIRT_XXL
-/* Paravirtualized systems may not have PSE or PGE available */
-#define NEED_PSE 0
-#define NEED_PGE 0
-#else
-#define NEED_PSE (1<<(X86_FEATURE_PSE) & 31)
-#define NEED_PGE (1<<(X86_FEATURE_PGE) & 31)
-#endif
-#define NEED_MSR (1<<(X86_FEATURE_MSR & 31))
-#define NEED_FXSR (1<<(X86_FEATURE_FXSR & 31))
-#define NEED_XMM (1<<(X86_FEATURE_XMM & 31))
-#define NEED_XMM2 (1<<(X86_FEATURE_XMM2 & 31))
-#define NEED_LM (1<<(X86_FEATURE_LM & 31))
-#else
-#define NEED_PSE 0
-#define NEED_MSR 0
-#define NEED_PGE 0
-#define NEED_FXSR 0
-#define NEED_XMM 0
-#define NEED_XMM2 0
-#define NEED_LM 0
-#endif
-
-#define REQUIRED_MASK0 (NEED_FPU|NEED_PSE|NEED_MSR|NEED_PAE|\
- NEED_CX8|NEED_PGE|NEED_FXSR|NEED_CMOV|\
- NEED_XMM|NEED_XMM2)
-#define SSE_MASK (NEED_XMM|NEED_XMM2)
-
-#define REQUIRED_MASK1 (NEED_LM|NEED_3DNOW)
-
-#define REQUIRED_MASK2 0
-#define REQUIRED_MASK3 (NEED_NOPL)
-#define REQUIRED_MASK4 (NEED_MOVBE)
-#define REQUIRED_MASK5 0
-#define REQUIRED_MASK6 0
-#define REQUIRED_MASK7 0
-#define REQUIRED_MASK8 0
-#define REQUIRED_MASK9 0
-#define REQUIRED_MASK10 0
-#define REQUIRED_MASK11 0
-#define REQUIRED_MASK12 0
-#define REQUIRED_MASK13 0
-#define REQUIRED_MASK14 0
-#define REQUIRED_MASK15 0
-#define REQUIRED_MASK16 0
-#define REQUIRED_MASK17 0
-#define REQUIRED_MASK18 0
-#define REQUIRED_MASK19 0
-#define REQUIRED_MASK20 0
-#define REQUIRED_MASK21 0
-#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)
-
-#endif /* _ASM_X86_REQUIRED_FEATURES_H */
diff --git a/tools/arch/x86/include/asm/cpufeatures.h b/tools/arch/x86/include/asm/cpufeatures.h
index ec9911379c61..9e3fa7942e7d 100644
--- a/tools/arch/x86/include/asm/cpufeatures.h
+++ b/tools/arch/x86/include/asm/cpufeatures.h
@@ -2,14 +2,6 @@
#ifndef _ASM_X86_CPUFEATURES_H
#define _ASM_X86_CPUFEATURES_H
-#ifndef _ASM_X86_REQUIRED_FEATURES_H
-#include <asm/required-features.h>
-#endif
-
-#ifndef _ASM_X86_DISABLED_FEATURES_H
-#include <asm/disabled-features.h>
-#endif
-
/*
* Defines x86 CPU feature bits
*/
diff --git a/tools/arch/x86/include/asm/disabled-features.h b/tools/arch/x86/include/asm/disabled-features.h
deleted file mode 100644
index c492bdc97b05..000000000000
--- a/tools/arch/x86/include/asm/disabled-features.h
+++ /dev/null
@@ -1,161 +0,0 @@
-#ifndef _ASM_X86_DISABLED_FEATURES_H
-#define _ASM_X86_DISABLED_FEATURES_H
-
-/* These features, although they might be available in a CPU
- * will not be used because the compile options to support
- * them are not present.
- *
- * This code allows them to be checked and disabled at
- * compile time without an explicit #ifdef. Use
- * cpu_feature_enabled().
- */
-
-#ifdef CONFIG_X86_UMIP
-# define DISABLE_UMIP 0
-#else
-# define DISABLE_UMIP (1<<(X86_FEATURE_UMIP & 31))
-#endif
-
-#ifdef CONFIG_X86_64
-# define DISABLE_VME (1<<(X86_FEATURE_VME & 31))
-# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))
-# define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31))
-# define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31))
-# define DISABLE_PCID 0
-#else
-# define DISABLE_VME 0
-# define DISABLE_K6_MTRR 0
-# define DISABLE_CYRIX_ARR 0
-# define DISABLE_CENTAUR_MCR 0
-# define DISABLE_PCID (1<<(X86_FEATURE_PCID & 31))
-#endif /* CONFIG_X86_64 */
-
-#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
-# define DISABLE_PKU 0
-# define DISABLE_OSPKE 0
-#else
-# define DISABLE_PKU (1<<(X86_FEATURE_PKU & 31))
-# define DISABLE_OSPKE (1<<(X86_FEATURE_OSPKE & 31))
-#endif /* CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS */
-
-#ifdef CONFIG_X86_5LEVEL
-# define DISABLE_LA57 0
-#else
-# define DISABLE_LA57 (1<<(X86_FEATURE_LA57 & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION
-# define DISABLE_PTI 0
-#else
-# define DISABLE_PTI (1 << (X86_FEATURE_PTI & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_RETPOLINE
-# define DISABLE_RETPOLINE 0
-#else
-# define DISABLE_RETPOLINE ((1 << (X86_FEATURE_RETPOLINE & 31)) | \
- (1 << (X86_FEATURE_RETPOLINE_LFENCE & 31)))
-#endif
-
-#ifdef CONFIG_MITIGATION_RETHUNK
-# define DISABLE_RETHUNK 0
-#else
-# define DISABLE_RETHUNK (1 << (X86_FEATURE_RETHUNK & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_UNRET_ENTRY
-# define DISABLE_UNRET 0
-#else
-# define DISABLE_UNRET (1 << (X86_FEATURE_UNRET & 31))
-#endif
-
-#ifdef CONFIG_MITIGATION_CALL_DEPTH_TRACKING
-# define DISABLE_CALL_DEPTH_TRACKING 0
-#else
-# define DISABLE_CALL_DEPTH_TRACKING (1 << (X86_FEATURE_CALL_DEPTH & 31))
-#endif
-
-#ifdef CONFIG_ADDRESS_MASKING
-# define DISABLE_LAM 0
-#else
-# define DISABLE_LAM (1 << (X86_FEATURE_LAM & 31))
-#endif
-
-#ifdef CONFIG_INTEL_IOMMU_SVM
-# define DISABLE_ENQCMD 0
-#else
-# define DISABLE_ENQCMD (1 << (X86_FEATURE_ENQCMD & 31))
-#endif
-
-#ifdef CONFIG_X86_SGX
-# define DISABLE_SGX 0
-#else
-# define DISABLE_SGX (1 << (X86_FEATURE_SGX & 31))
-#endif
-
-#ifdef CONFIG_XEN_PV
-# define DISABLE_XENPV 0
-#else
-# define DISABLE_XENPV (1 << (X86_FEATURE_XENPV & 31))
-#endif
-
-#ifdef CONFIG_INTEL_TDX_GUEST
-# define DISABLE_TDX_GUEST 0
-#else
-# define DISABLE_TDX_GUEST (1 << (X86_FEATURE_TDX_GUEST & 31))
-#endif
-
-#ifdef CONFIG_X86_USER_SHADOW_STACK
-#define DISABLE_USER_SHSTK 0
-#else
-#define DISABLE_USER_SHSTK (1 << (X86_FEATURE_USER_SHSTK & 31))
-#endif
-
-#ifdef CONFIG_X86_KERNEL_IBT
-#define DISABLE_IBT 0
-#else
-#define DISABLE_IBT (1 << (X86_FEATURE_IBT & 31))
-#endif
-
-#ifdef CONFIG_X86_FRED
-# define DISABLE_FRED 0
-#else
-# define DISABLE_FRED (1 << (X86_FEATURE_FRED & 31))
-#endif
-
-#ifdef CONFIG_KVM_AMD_SEV
-#define DISABLE_SEV_SNP 0
-#else
-#define DISABLE_SEV_SNP (1 << (X86_FEATURE_SEV_SNP & 31))
-#endif
-
-/*
- * Make sure to add features to the correct mask
- */
-#define DISABLED_MASK0 (DISABLE_VME)
-#define DISABLED_MASK1 0
-#define DISABLED_MASK2 0
-#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR)
-#define DISABLED_MASK4 (DISABLE_PCID)
-#define DISABLED_MASK5 0
-#define DISABLED_MASK6 0
-#define DISABLED_MASK7 (DISABLE_PTI)
-#define DISABLED_MASK8 (DISABLE_XENPV|DISABLE_TDX_GUEST)
-#define DISABLED_MASK9 (DISABLE_SGX)
-#define DISABLED_MASK10 0
-#define DISABLED_MASK11 (DISABLE_RETPOLINE|DISABLE_RETHUNK|DISABLE_UNRET| \
- DISABLE_CALL_DEPTH_TRACKING|DISABLE_USER_SHSTK)
-#define DISABLED_MASK12 (DISABLE_FRED|DISABLE_LAM)
-#define DISABLED_MASK13 0
-#define DISABLED_MASK14 0
-#define DISABLED_MASK15 0
-#define DISABLED_MASK16 (DISABLE_PKU|DISABLE_OSPKE|DISABLE_LA57|DISABLE_UMIP| \
- DISABLE_ENQCMD)
-#define DISABLED_MASK17 0
-#define DISABLED_MASK18 (DISABLE_IBT)
-#define DISABLED_MASK19 (DISABLE_SEV_SNP)
-#define DISABLED_MASK20 0
-#define DISABLED_MASK21 0
-#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)
-
-#endif /* _ASM_X86_DISABLED_FEATURES_H */
diff --git a/tools/arch/x86/include/asm/required-features.h b/tools/arch/x86/include/asm/required-features.h
deleted file mode 100644
index 0068133cb622..000000000000
--- a/tools/arch/x86/include/asm/required-features.h
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef _ASM_X86_REQUIRED_FEATURES_H
-#define _ASM_X86_REQUIRED_FEATURES_H
-
-/* Define minimum CPUID feature set for kernel These bits are checked
- really early to actually display a visible error message before the
- kernel dies. Make sure to assign features to the proper mask!
-
- Some requirements that are not in CPUID yet are also in the
- CONFIG_X86_MINIMUM_CPU_FAMILY which is checked too.
-
- The real information is in arch/x86/Kconfig.cpu, this just converts
- the CONFIGs into a bitmask */
-
-#ifndef CONFIG_MATH_EMULATION
-# define NEED_FPU (1<<(X86_FEATURE_FPU & 31))
-#else
-# define NEED_FPU 0
-#endif
-
-#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
-# define NEED_PAE (1<<(X86_FEATURE_PAE & 31))
-#else
-# define NEED_PAE 0
-#endif
-
-#ifdef CONFIG_X86_CX8
-# define NEED_CX8 (1<<(X86_FEATURE_CX8 & 31))
-#else
-# define NEED_CX8 0
-#endif
-
-#if defined(CONFIG_X86_CMOV) || defined(CONFIG_X86_64)
-# define NEED_CMOV (1<<(X86_FEATURE_CMOV & 31))
-#else
-# define NEED_CMOV 0
-#endif
-
-# define NEED_3DNOW 0
-
-#if defined(CONFIG_X86_P6_NOP) || defined(CONFIG_X86_64)
-# define NEED_NOPL (1<<(X86_FEATURE_NOPL & 31))
-#else
-# define NEED_NOPL 0
-#endif
-
-#ifdef CONFIG_MATOM
-# define NEED_MOVBE (1<<(X86_FEATURE_MOVBE & 31))
-#else
-# define NEED_MOVBE 0
-#endif
-
-#ifdef CONFIG_X86_64
-#ifdef CONFIG_PARAVIRT_XXL
-/* Paravirtualized systems may not have PSE or PGE available */
-#define NEED_PSE 0
-#define NEED_PGE 0
-#else
-#define NEED_PSE (1<<(X86_FEATURE_PSE) & 31)
-#define NEED_PGE (1<<(X86_FEATURE_PGE) & 31)
-#endif
-#define NEED_MSR (1<<(X86_FEATURE_MSR & 31))
-#define NEED_FXSR (1<<(X86_FEATURE_FXSR & 31))
-#define NEED_XMM (1<<(X86_FEATURE_XMM & 31))
-#define NEED_XMM2 (1<<(X86_FEATURE_XMM2 & 31))
-#define NEED_LM (1<<(X86_FEATURE_LM & 31))
-#else
-#define NEED_PSE 0
-#define NEED_MSR 0
-#define NEED_PGE 0
-#define NEED_FXSR 0
-#define NEED_XMM 0
-#define NEED_XMM2 0
-#define NEED_LM 0
-#endif
-
-#define REQUIRED_MASK0 (NEED_FPU|NEED_PSE|NEED_MSR|NEED_PAE|\
- NEED_CX8|NEED_PGE|NEED_FXSR|NEED_CMOV|\
- NEED_XMM|NEED_XMM2)
-#define SSE_MASK (NEED_XMM|NEED_XMM2)
-
-#define REQUIRED_MASK1 (NEED_LM|NEED_3DNOW)
-
-#define REQUIRED_MASK2 0
-#define REQUIRED_MASK3 (NEED_NOPL)
-#define REQUIRED_MASK4 (NEED_MOVBE)
-#define REQUIRED_MASK5 0
-#define REQUIRED_MASK6 0
-#define REQUIRED_MASK7 0
-#define REQUIRED_MASK8 0
-#define REQUIRED_MASK9 0
-#define REQUIRED_MASK10 0
-#define REQUIRED_MASK11 0
-#define REQUIRED_MASK12 0
-#define REQUIRED_MASK13 0
-#define REQUIRED_MASK14 0
-#define REQUIRED_MASK15 0
-#define REQUIRED_MASK16 0
-#define REQUIRED_MASK17 0
-#define REQUIRED_MASK18 0
-#define REQUIRED_MASK19 0
-#define REQUIRED_MASK20 0
-#define REQUIRED_MASK21 0
-#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 22)
-
-#endif /* _ASM_X86_REQUIRED_FEATURES_H */
--git a/tools/perf/check-headers.sh b/tools/perf/check-headers.sh
index d3c6e10dce73..a4499e5a6f9c 100755
--- a/tools/perf/check-headers.sh
+++ b/tools/perf/check-headers.sh
@@ -26,8 +26,6 @@ FILES=(
"include/linux/hash.h"
"include/linux/list-sort.h"
"include/uapi/linux/hw_breakpoint.h"
- "arch/x86/include/asm/disabled-features.h"
- "arch/x86/include/asm/required-features.h"
"arch/x86/include/asm/cpufeatures.h"
"arch/x86/include/asm/inat_types.h"
"arch/x86/include/asm/emulate_prefix.h"
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v6 5/5] x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
` (3 preceding siblings ...)
2025-02-28 8:23 ` [PATCH v6 4/5] x86/cpufeatures: Remove {disabled,required}-features.h Xin Li (Intel)
@ 2025-02-28 8:23 ` Xin Li (Intel)
2025-02-28 9:26 ` [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Ingo Molnar
5 siblings, 0 replies; 16+ messages in thread
From: Xin Li (Intel) @ 2025-02-28 8:23 UTC (permalink / raw)
To: linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
Generate macros {REQUIRED|DISABLED}_MASK_BIT_SET in the newly added AWK
script that generates the required and disabled feature mask header.
Suggested-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Xin Li (Intel) <xin@zytor.com>
Reviewed-by: Brian Gerst <brgerst@gmail.com>
---
Changes in v4:
* Use '1U' instead of '1' in feature mask shifting (Andrew Cooper).
* Checking NCAPINTS isn't necessary anymore. It was needed when these
macros had to be manually updated, but now if cpufeatures.h changes
this header will be regenerated (Brian Gerst).
---
arch/x86/include/asm/cpufeature.h | 69 -------------------------------
arch/x86/tools/featuremasks.awk | 9 +++-
2 files changed, 8 insertions(+), 70 deletions(-)
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 077a5bbd1cc5..b829a12eda8a 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -55,75 +55,6 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
#define test_cpu_cap(c, bit) \
arch_test_bit(bit, (unsigned long *)((c)->x86_capability))
-/*
- * There are 32 bits/features in each mask word. The high bits
- * (selected with (bit>>5) give us the word number and the low 5
- * bits give us the bit/feature number inside the word.
- * (1UL<<((bit)&31) gives us a mask for the feature_bit so we can
- * see if it is set in the mask word.
- */
-#define CHECK_BIT_IN_MASK_WORD(maskname, word, bit) \
- (((bit)>>5)==(word) && (1UL<<((bit)&31) & maskname##word ))
-
-/*
- * {REQUIRED,DISABLED}_MASK_CHECK below may seem duplicated with the
- * following BUILD_BUG_ON_ZERO() check but when NCAPINTS gets changed, all
- * header macros which use NCAPINTS need to be changed. The duplicated macro
- * use causes the compiler to issue errors for all headers so that all usage
- * sites can be corrected.
- */
-#define REQUIRED_MASK_BIT_SET(feature_bit) \
- ( CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 0, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 1, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 2, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 3, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 4, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 5, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 6, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 7, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 8, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 9, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 10, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 11, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 12, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 13, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 14, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 15, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 16, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 17, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 18, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 19, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 20, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 21, feature_bit) || \
- REQUIRED_MASK_CHECK || \
- BUILD_BUG_ON_ZERO(NCAPINTS != 22))
-
-#define DISABLED_MASK_BIT_SET(feature_bit) \
- ( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 0, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 1, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 2, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 3, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 4, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 5, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 6, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 7, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 8, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 9, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 10, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 11, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 12, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 13, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 14, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 15, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 16, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 17, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 18, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 19, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 20, feature_bit) || \
- CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 21, feature_bit) || \
- DISABLED_MASK_CHECK || \
- BUILD_BUG_ON_ZERO(NCAPINTS != 22))
-
#define cpu_has(c, bit) \
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
test_cpu_cap(c, bit))
diff --git a/arch/x86/tools/featuremasks.awk b/arch/x86/tools/featuremasks.awk
index fd3e72147157..2d9201c841cb 100755
--- a/arch/x86/tools/featuremasks.awk
+++ b/arch/x86/tools/featuremasks.awk
@@ -74,7 +74,14 @@ END {
for (i = 0; i < ncapints; i++)
printf "#define %s_MASK%d\t0x%08xU\n", s, i, masks[i];
- printf "#define %s_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != %d)\n\n", s, ncapints;
+ printf "\n#define %s_MASK_BIT_SET(x)\t\t\t\\\n", s;
+ printf "\t((\t\t\t\t\t";
+ for (i = 0; i < ncapints; i++) {
+ if (masks[i])
+ printf "\t\\\n\t\t((x) >> 5) == %2d ? %s_MASK%d :", i, s, i;
+ }
+ printf " 0\t\\\n";
+ printf "\t) & (1U << ((x) & 31)))\n\n";
}
printf "#endif /* _ASM_X86_FEATUREMASKS_H */\n";
--
2.48.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
` (4 preceding siblings ...)
2025-02-28 8:23 ` [PATCH v6 5/5] x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET Xin Li (Intel)
@ 2025-02-28 9:26 ` Ingo Molnar
5 siblings, 0 replies; 16+ messages in thread
From: Ingo Molnar @ 2025-02-28 9:26 UTC (permalink / raw)
To: Xin Li (Intel)
Cc: linux-kernel, linux-perf-users, tglx, mingo, bp, dave.hansen, x86,
hpa, will, peterz, yury.norov, akpm, acme, namhyung, brgerst,
andrew.cooper3, nik.borisov
* Xin Li (Intel) <xin@zytor.com> wrote:
> The x86 build process first generates required and disabled feature
> masks based on current build config, and then uses these generated
> masks to compile the source code. When a CPU feature is not enabled
> in a build config, e.g., when CONFIG_X86_FRED=n, its feature disable
> flag, i.e., DISABLE_FRED, needs to be properly defined and added to
> a specific disabled CPU features mask in <asm/disabled-features.h>,
> as the following patch does:
> https://lore.kernel.org/all/20231205105030.8698-8-xin3.li@intel.com/.
> As a result, the FRED feature bit is surely cleared in the generated
> kernel binary when CONFIG_X86_FRED=n.
>
> Recently there is another case to repeat the same exercise for the
> AMD SEV-SNP CPU feature:
> https://lore.kernel.org/all/20240126041126.1927228-2-michael.roth@amd.com/.
> https://lore.kernel.org/all/20240126041126.1927228-23-michael.roth@amd.com/.
>
> It was one thing when there were four of CPU feature masks, but with
> over 20 it is going to cause mistakes, e.g.,
> https://lore.kernel.org/lkml/aaed79d5-d683-d1bc-7ba1-b33c8d6db618@suse.com/.
>
> We want to eliminate the stupidly repeated exercise to manually assign
> features to CPU feature words through introducing an AWK script to
> automatically generate a header with required and disabled CPU feature
> masks based on current build config, and this patch set does that.
>
> Link to v5:
> https://lore.kernel.org/lkml/20250106070727.3211006-1-xin@zytor.com/
>
>
> H. Peter Anvin (Intel) (3):
> x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8
> x86/cpufeatures: Add {required,disabled} feature configs
> x86/cpufeatures: Generate a feature mask header based on build config
>
> Xin Li (Intel) (2):
> x86/cpufeatures: Remove {disabled,required}-features.h
> x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET
> 24 files changed, 320 insertions(+), 634 deletions(-)
Very nice!
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Thanks,
Ingo
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-02-28 8:23 ` [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config Xin Li (Intel)
@ 2025-03-03 11:38 ` Aithal, Srikanth
2025-03-03 12:05 ` H. Peter Anvin
0 siblings, 1 reply; 16+ messages in thread
From: Aithal, Srikanth @ 2025-03-03 11:38 UTC (permalink / raw)
To: Xin Li (Intel), linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, hpa, will, peterz, yury.norov,
akpm, acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On 2/28/2025 1:53 PM, Xin Li (Intel) wrote:
> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>
> Introduce an AWK script to auto-generate a header with required and
> disabled feature masks based on <asm/cpufeatures.h> and current build
> config. Thus for any CPU feature with a build config, e.g., X86_FRED,
> simply add
>
> config X86_DISABLED_FEATURE_FRED
> def_bool y
> depends on !X86_FRED
>
> to arch/x86/Kconfig.cpufeatures, instead of adding a conditional CPU
> feature disable flag, e.g., DISABLE_FRED.
>
> Lastly the generated required and disabled feature masks will be added
> to their corresponding feature masks for this particular compile-time
> configuration.
>
> [ Xin: build integration improvements ]
>
> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
> Signed-off-by: Xin Li (Intel) <xin@zytor.com>
> Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
> ---
>
> Change in v6:
> * Make the AWK script work for mawk and BusyBox awk (Borislav Petkov).
>
> Change in v5:
> * More polishes (Nikolay Borisov).
>
> Changes in v4:
> * Add a few high-level comments to the AWK script (Nikolay Borisov).
> * Enforce CPU feature mask values to be unsigned.
>
> Changes in v3:
> * Remove AWK code that generates extra debugging comments (Brian Gerst).
> * Move SSE_MASK to verify_cpu.S, the only place it is used (Brian Gerst).
>
> Change in v2:
> * Remove code generating unused macros {REQUIRED,DISABLED}_FEATURE(x)
> to tell if a CPU feature, e.g., X86_FEATURE_FRED, is a required or
> disabled feature for this particular compile-time configuration.
> ---
> arch/x86/Makefile | 17 ++++++-
> arch/x86/boot/cpucheck.c | 3 +-
> arch/x86/boot/cpuflags.c | 1 -
> arch/x86/boot/mkcpustr.c | 3 +-
> arch/x86/include/asm/Kbuild | 1 +
> arch/x86/include/asm/cpufeature.h | 1 +
> arch/x86/include/asm/cpufeatures.h | 8 ---
> arch/x86/kernel/verify_cpu.S | 4 ++
> arch/x86/tools/featuremasks.awk | 81 ++++++++++++++++++++++++++++++
> 9 files changed, 105 insertions(+), 14 deletions(-)
> create mode 100755 arch/x86/tools/featuremasks.awk
>
> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> index 6784129328f6..60583987d320 100644
> --- a/arch/x86/Makefile
> +++ b/arch/x86/Makefile
> @@ -263,9 +263,22 @@ archscripts: scripts_basic
> $(Q)$(MAKE) $(build)=arch/x86/tools relocs
>
> ###
> -# Syscall table generation
> +# Feature masks header and syscall table generation
>
> -archheaders:
> +out := arch/x86/include/generated/asm
> +featuremasks_hdr := featuremasks.h
> +featuremasks_awk := $(srctree)/arch/x86/tools/featuremasks.awk
> +cpufeatures_hdr := $(srctree)/arch/x86/include/asm/cpufeatures.h
> +quiet_cmd_gen_featuremasks = GEN $@
> + cmd_gen_featuremasks = $(AWK) -f $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) > $@
> +
> +$(out)/$(featuremasks_hdr): $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) FORCE
> + $(shell mkdir -p $(out))
> + $(call if_changed,gen_featuremasks)
> +
> +targets += $(out)/$(featuremasks_hdr)
> +
> +archheaders: $(out)/$(featuremasks_hdr)
> $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
>
> ###
> diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
> index 0aae4d4ed615..8d03a741d1b2 100644
> --- a/arch/x86/boot/cpucheck.c
> +++ b/arch/x86/boot/cpucheck.c
> @@ -22,10 +22,11 @@
> # include "boot.h"
> #endif
> #include <linux/types.h>
> +#include <asm/featuremasks.h>
> #include <asm/intel-family.h>
> #include <asm/processor-flags.h>
> -#include <asm/required-features.h>
> #include <asm/msr-index.h>
> +
> #include "string.h"
> #include "msr.h"
>
> diff --git a/arch/x86/boot/cpuflags.c b/arch/x86/boot/cpuflags.c
> index d75237ba7ce9..0cabdacb2a2f 100644
> --- a/arch/x86/boot/cpuflags.c
> +++ b/arch/x86/boot/cpuflags.c
> @@ -3,7 +3,6 @@
> #include "bitops.h"
>
> #include <asm/processor-flags.h>
> -#include <asm/required-features.h>
> #include <asm/msr-index.h>
> #include "cpuflags.h"
>
> diff --git a/arch/x86/boot/mkcpustr.c b/arch/x86/boot/mkcpustr.c
> index da0ccc5de538..b90110109675 100644
> --- a/arch/x86/boot/mkcpustr.c
> +++ b/arch/x86/boot/mkcpustr.c
> @@ -12,8 +12,6 @@
>
> #include <stdio.h>
>
> -#include "../include/asm/required-features.h"
> -#include "../include/asm/disabled-features.h"
> #include "../include/asm/cpufeatures.h"
> #include "../include/asm/vmxfeatures.h"
> #include "../kernel/cpu/capflags.c"
> @@ -23,6 +21,7 @@ int main(void)
> int i, j;
> const char *str;
>
> + printf("#include <asm/featuremasks.h>\n\n");
> printf("static const char x86_cap_strs[] =\n");
>
> for (i = 0; i < NCAPINTS; i++) {
> diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild
> index 58f4ddecc5fa..51022d21003e 100644
> --- a/arch/x86/include/asm/Kbuild
> +++ b/arch/x86/include/asm/Kbuild
> @@ -8,6 +8,7 @@ generated-y += syscalls_x32.h
> generated-y += unistd_32_ia32.h
> generated-y += unistd_64_x32.h
> generated-y += xen-hypercalls.h
> +generated-y += featuremasks.h
>
> generic-y += early_ioremap.h
> generic-y += fprobe.h
> diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
> index de1ad09fe8d7..077a5bbd1cc5 100644
> --- a/arch/x86/include/asm/cpufeature.h
> +++ b/arch/x86/include/asm/cpufeature.h
> @@ -9,6 +9,7 @@
> #include <asm/asm.h>
> #include <linux/bitops.h>
> #include <asm/alternative.h>
> +#include <asm/featuremasks.h>
>
> enum cpuid_leafs
> {
> diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
> index c8701abb7752..b9b7329f4ac4 100644
> --- a/arch/x86/include/asm/cpufeatures.h
> +++ b/arch/x86/include/asm/cpufeatures.h
> @@ -2,14 +2,6 @@
> #ifndef _ASM_X86_CPUFEATURES_H
> #define _ASM_X86_CPUFEATURES_H
>
> -#ifndef _ASM_X86_REQUIRED_FEATURES_H
> -#include <asm/required-features.h>
> -#endif
> -
> -#ifndef _ASM_X86_DISABLED_FEATURES_H
> -#include <asm/disabled-features.h>
> -#endif
> -
> /*
> * Defines x86 CPU feature bits
> */
> diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S
> index 1258a5872d12..a23a65d5d177 100644
> --- a/arch/x86/kernel/verify_cpu.S
> +++ b/arch/x86/kernel/verify_cpu.S
> @@ -29,8 +29,12 @@
> */
>
> #include <asm/cpufeatures.h>
> +#include <asm/featuremasks.h>
> #include <asm/msr-index.h>
>
> +#define SSE_MASK \
> + (REQUIRED_MASK0 & ((1<<(X86_FEATURE_XMM & 31)) | (1<<(X86_FEATURE_XMM2 & 31))))
> +
> SYM_FUNC_START_LOCAL(verify_cpu)
> pushf # Save caller passed flags
> push $0 # Kill any dangerous flags
> diff --git a/arch/x86/tools/featuremasks.awk b/arch/x86/tools/featuremasks.awk
> new file mode 100755
> index 000000000000..fd3e72147157
> --- /dev/null
> +++ b/arch/x86/tools/featuremasks.awk
> @@ -0,0 +1,81 @@
> +#!/usr/bin/awk
> +#
> +# Convert cpufeatures.h to a list of compile-time masks
> +# Note: this blithly assumes that each word has at least one
> +# feature defined in it; if not, something else is wrong!
> +#
> +
> +BEGIN {
> + printf "#ifndef _ASM_X86_FEATUREMASKS_H\n";
> + printf "#define _ASM_X86_FEATUREMASKS_H\n\n";
> +
> + file = 0
> +}
> +
> +FNR == 1 {
> + ++file;
> +
> + # arch/x86/include/asm/cpufeatures.h
> + if (file == 1)
> + FS = "[ \t()*+]+";
> +
> + # .config
> + if (file == 2)
> + FS = "=";
> +}
> +
> +# Create a dictionary of sorts, containing all defined feature bits
> +file == 1 && $1 ~ /^#define$/ && $2 ~ /^X86_FEATURE_/ {
> + nfeat = $3 * $4 + $5;
> + feat = $2;
> + sub(/^X86_FEATURE_/, "", feat);
> + feats[nfeat] = feat;
> +}
> +file == 1 && $1 ~ /^#define$/ && $2 == "NCAPINTS" {
> + ncapints = int($3);
> +}
> +
> +# Create a dictionary featstat[REQUIRED|DISABLED, FEATURE_NAME] = on | off
> +file == 2 && $1 ~ /^CONFIG_X86_(REQUIRED|DISABLED)_FEATURE_/ {
> + on = ($2 == "y");
> + if (split($1, fs, "CONFIG_X86_|_FEATURE_") == 3)
> + featstat[fs[2], fs[3]] = on;
> +}
> +
> +END {
> + sets[1] = "REQUIRED";
> + sets[2] = "DISABLED";
> +
> + for (ns in sets) {
> + s = sets[ns];
> +
> + printf "/*\n";
> + printf " * %s features:\n", s;
> + printf " *\n";
> + fstr = "";
> + for (i = 0; i < ncapints; i++) {
> + mask = 0;
> + for (j = 0; j < 32; j++) {
> + feat = feats[i*32 + j];
> + if (featstat[s, feat]) {
> + nfstr = fstr " " feat;
> + if (length(nfstr) > 72) {
> + printf " * %s\n", fstr;
> + nfstr = " " feat;
> + }
> + fstr = nfstr;
> + mask += (2 ^ j);
> + }
> + }
> + masks[i] = mask;
> + }
> + printf " * %s\n */\n", fstr;
> +
> + for (i = 0; i < ncapints; i++)
> + printf "#define %s_MASK%d\t0x%08xU\n", s, i, masks[i];
> +
> + printf "#define %s_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != %d)\n\n", s, ncapints;
> + }
> +
> + printf "#endif /* _ASM_X86_FEATUREMASKS_H */\n";
> +}
Building kselftests is regressing with this commit on next-20250303.
# make headers
HOSTCC scripts/basic/fixdep
HOSTCC scripts/unifdef
WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h
WRAP arch/x86/include/generated/uapi/asm/errno.h
WRAP arch/x86/include/generated/uapi/asm/fcntl.h
WRAP arch/x86/include/generated/uapi/asm/ioctl.h
WRAP arch/x86/include/generated/uapi/asm/ioctls.h
WRAP arch/x86/include/generated/uapi/asm/ipcbuf.h
WRAP arch/x86/include/generated/uapi/asm/param.h
WRAP arch/x86/include/generated/uapi/asm/poll.h
WRAP arch/x86/include/generated/uapi/asm/resource.h
WRAP arch/x86/include/generated/uapi/asm/socket.h
WRAP arch/x86/include/generated/uapi/asm/sockios.h
WRAP arch/x86/include/generated/uapi/asm/termbits.h
WRAP arch/x86/include/generated/uapi/asm/termios.h
WRAP arch/x86/include/generated/uapi/asm/types.h
make[1]: *** No rule to make target '.config', needed by
'arch/x86/include/generated/asm/featuremasks.h'. Stop.
make: *** [Makefile:251: __sub-make] Error 2
The same used to work fine until next-20250228.
Recreation steps:
1. Clone next-20250303
2. make distclean
3. make headers
Srikanth Aithal <sraithal@amd.com>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-03 11:38 ` Aithal, Srikanth
@ 2025-03-03 12:05 ` H. Peter Anvin
2025-03-03 13:25 ` Borislav Petkov
0 siblings, 1 reply; 16+ messages in thread
From: H. Peter Anvin @ 2025-03-03 12:05 UTC (permalink / raw)
To: Aithal, Srikanth, Xin Li (Intel), linux-kernel, linux-perf-users
Cc: tglx, mingo, bp, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On March 3, 2025 3:38:05 AM PST, "Aithal, Srikanth" <sraithal@amd.com> wrote:
>On 2/28/2025 1:53 PM, Xin Li (Intel) wrote:
>> From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
>>
>> Introduce an AWK script to auto-generate a header with required and
>> disabled feature masks based on <asm/cpufeatures.h> and current build
>> config. Thus for any CPU feature with a build config, e.g., X86_FRED,
>> simply add
>>
>> config X86_DISABLED_FEATURE_FRED
>> def_bool y
>> depends on !X86_FRED
>>
>> to arch/x86/Kconfig.cpufeatures, instead of adding a conditional CPU
>> feature disable flag, e.g., DISABLE_FRED.
>>
>> Lastly the generated required and disabled feature masks will be added
>> to their corresponding feature masks for this particular compile-time
>> configuration.
>>
>> [ Xin: build integration improvements ]
>>
>> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
>> Signed-off-by: Xin Li (Intel) <xin@zytor.com>
>> Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
>> ---
>>
>> Change in v6:
>> * Make the AWK script work for mawk and BusyBox awk (Borislav Petkov).
>>
>> Change in v5:
>> * More polishes (Nikolay Borisov).
>>
>> Changes in v4:
>> * Add a few high-level comments to the AWK script (Nikolay Borisov).
>> * Enforce CPU feature mask values to be unsigned.
>>
>> Changes in v3:
>> * Remove AWK code that generates extra debugging comments (Brian Gerst).
>> * Move SSE_MASK to verify_cpu.S, the only place it is used (Brian Gerst).
>>
>> Change in v2:
>> * Remove code generating unused macros {REQUIRED,DISABLED}_FEATURE(x)
>> to tell if a CPU feature, e.g., X86_FEATURE_FRED, is a required or
>> disabled feature for this particular compile-time configuration.
>> ---
>> arch/x86/Makefile | 17 ++++++-
>> arch/x86/boot/cpucheck.c | 3 +-
>> arch/x86/boot/cpuflags.c | 1 -
>> arch/x86/boot/mkcpustr.c | 3 +-
>> arch/x86/include/asm/Kbuild | 1 +
>> arch/x86/include/asm/cpufeature.h | 1 +
>> arch/x86/include/asm/cpufeatures.h | 8 ---
>> arch/x86/kernel/verify_cpu.S | 4 ++
>> arch/x86/tools/featuremasks.awk | 81 ++++++++++++++++++++++++++++++
>> 9 files changed, 105 insertions(+), 14 deletions(-)
>> create mode 100755 arch/x86/tools/featuremasks.awk
>>
>> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
>> index 6784129328f6..60583987d320 100644
>> --- a/arch/x86/Makefile
>> +++ b/arch/x86/Makefile
>> @@ -263,9 +263,22 @@ archscripts: scripts_basic
>> $(Q)$(MAKE) $(build)=arch/x86/tools relocs
>> ###
>> -# Syscall table generation
>> +# Feature masks header and syscall table generation
>> -archheaders:
>> +out := arch/x86/include/generated/asm
>> +featuremasks_hdr := featuremasks.h
>> +featuremasks_awk := $(srctree)/arch/x86/tools/featuremasks.awk
>> +cpufeatures_hdr := $(srctree)/arch/x86/include/asm/cpufeatures.h
>> +quiet_cmd_gen_featuremasks = GEN $@
>> + cmd_gen_featuremasks = $(AWK) -f $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) > $@
>> +
>> +$(out)/$(featuremasks_hdr): $(featuremasks_awk) $(cpufeatures_hdr) $(KCONFIG_CONFIG) FORCE
>> + $(shell mkdir -p $(out))
>> + $(call if_changed,gen_featuremasks)
>> +
>> +targets += $(out)/$(featuremasks_hdr)
>> +
>> +archheaders: $(out)/$(featuremasks_hdr)
>> $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
>> ###
>> diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
>> index 0aae4d4ed615..8d03a741d1b2 100644
>> --- a/arch/x86/boot/cpucheck.c
>> +++ b/arch/x86/boot/cpucheck.c
>> @@ -22,10 +22,11 @@
>> # include "boot.h"
>> #endif
>> #include <linux/types.h>
>> +#include <asm/featuremasks.h>
>> #include <asm/intel-family.h>
>> #include <asm/processor-flags.h>
>> -#include <asm/required-features.h>
>> #include <asm/msr-index.h>
>> +
>> #include "string.h"
>> #include "msr.h"
>> diff --git a/arch/x86/boot/cpuflags.c b/arch/x86/boot/cpuflags.c
>> index d75237ba7ce9..0cabdacb2a2f 100644
>> --- a/arch/x86/boot/cpuflags.c
>> +++ b/arch/x86/boot/cpuflags.c
>> @@ -3,7 +3,6 @@
>> #include "bitops.h"
>> #include <asm/processor-flags.h>
>> -#include <asm/required-features.h>
>> #include <asm/msr-index.h>
>> #include "cpuflags.h"
>> diff --git a/arch/x86/boot/mkcpustr.c b/arch/x86/boot/mkcpustr.c
>> index da0ccc5de538..b90110109675 100644
>> --- a/arch/x86/boot/mkcpustr.c
>> +++ b/arch/x86/boot/mkcpustr.c
>> @@ -12,8 +12,6 @@
>> #include <stdio.h>
>> -#include "../include/asm/required-features.h"
>> -#include "../include/asm/disabled-features.h"
>> #include "../include/asm/cpufeatures.h"
>> #include "../include/asm/vmxfeatures.h"
>> #include "../kernel/cpu/capflags.c"
>> @@ -23,6 +21,7 @@ int main(void)
>> int i, j;
>> const char *str;
>> + printf("#include <asm/featuremasks.h>\n\n");
>> printf("static const char x86_cap_strs[] =\n");
>> for (i = 0; i < NCAPINTS; i++) {
>> diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild
>> index 58f4ddecc5fa..51022d21003e 100644
>> --- a/arch/x86/include/asm/Kbuild
>> +++ b/arch/x86/include/asm/Kbuild
>> @@ -8,6 +8,7 @@ generated-y += syscalls_x32.h
>> generated-y += unistd_32_ia32.h
>> generated-y += unistd_64_x32.h
>> generated-y += xen-hypercalls.h
>> +generated-y += featuremasks.h
>> generic-y += early_ioremap.h
>> generic-y += fprobe.h
>> diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
>> index de1ad09fe8d7..077a5bbd1cc5 100644
>> --- a/arch/x86/include/asm/cpufeature.h
>> +++ b/arch/x86/include/asm/cpufeature.h
>> @@ -9,6 +9,7 @@
>> #include <asm/asm.h>
>> #include <linux/bitops.h>
>> #include <asm/alternative.h>
>> +#include <asm/featuremasks.h>
>> enum cpuid_leafs
>> {
>> diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
>> index c8701abb7752..b9b7329f4ac4 100644
>> --- a/arch/x86/include/asm/cpufeatures.h
>> +++ b/arch/x86/include/asm/cpufeatures.h
>> @@ -2,14 +2,6 @@
>> #ifndef _ASM_X86_CPUFEATURES_H
>> #define _ASM_X86_CPUFEATURES_H
>> -#ifndef _ASM_X86_REQUIRED_FEATURES_H
>> -#include <asm/required-features.h>
>> -#endif
>> -
>> -#ifndef _ASM_X86_DISABLED_FEATURES_H
>> -#include <asm/disabled-features.h>
>> -#endif
>> -
>> /*
>> * Defines x86 CPU feature bits
>> */
>> diff --git a/arch/x86/kernel/verify_cpu.S b/arch/x86/kernel/verify_cpu.S
>> index 1258a5872d12..a23a65d5d177 100644
>> --- a/arch/x86/kernel/verify_cpu.S
>> +++ b/arch/x86/kernel/verify_cpu.S
>> @@ -29,8 +29,12 @@
>> */
>> #include <asm/cpufeatures.h>
>> +#include <asm/featuremasks.h>
>> #include <asm/msr-index.h>
>> +#define SSE_MASK \
>> + (REQUIRED_MASK0 & ((1<<(X86_FEATURE_XMM & 31)) | (1<<(X86_FEATURE_XMM2 & 31))))
>> +
>> SYM_FUNC_START_LOCAL(verify_cpu)
>> pushf # Save caller passed flags
>> push $0 # Kill any dangerous flags
>> diff --git a/arch/x86/tools/featuremasks.awk b/arch/x86/tools/featuremasks.awk
>> new file mode 100755
>> index 000000000000..fd3e72147157
>> --- /dev/null
>> +++ b/arch/x86/tools/featuremasks.awk
>> @@ -0,0 +1,81 @@
>> +#!/usr/bin/awk
>> +#
>> +# Convert cpufeatures.h to a list of compile-time masks
>> +# Note: this blithly assumes that each word has at least one
>> +# feature defined in it; if not, something else is wrong!
>> +#
>> +
>> +BEGIN {
>> + printf "#ifndef _ASM_X86_FEATUREMASKS_H\n";
>> + printf "#define _ASM_X86_FEATUREMASKS_H\n\n";
>> +
>> + file = 0
>> +}
>> +
>> +FNR == 1 {
>> + ++file;
>> +
>> + # arch/x86/include/asm/cpufeatures.h
>> + if (file == 1)
>> + FS = "[ \t()*+]+";
>> +
>> + # .config
>> + if (file == 2)
>> + FS = "=";
>> +}
>> +
>> +# Create a dictionary of sorts, containing all defined feature bits
>> +file == 1 && $1 ~ /^#define$/ && $2 ~ /^X86_FEATURE_/ {
>> + nfeat = $3 * $4 + $5;
>> + feat = $2;
>> + sub(/^X86_FEATURE_/, "", feat);
>> + feats[nfeat] = feat;
>> +}
>> +file == 1 && $1 ~ /^#define$/ && $2 == "NCAPINTS" {
>> + ncapints = int($3);
>> +}
>> +
>> +# Create a dictionary featstat[REQUIRED|DISABLED, FEATURE_NAME] = on | off
>> +file == 2 && $1 ~ /^CONFIG_X86_(REQUIRED|DISABLED)_FEATURE_/ {
>> + on = ($2 == "y");
>> + if (split($1, fs, "CONFIG_X86_|_FEATURE_") == 3)
>> + featstat[fs[2], fs[3]] = on;
>> +}
>> +
>> +END {
>> + sets[1] = "REQUIRED";
>> + sets[2] = "DISABLED";
>> +
>> + for (ns in sets) {
>> + s = sets[ns];
>> +
>> + printf "/*\n";
>> + printf " * %s features:\n", s;
>> + printf " *\n";
>> + fstr = "";
>> + for (i = 0; i < ncapints; i++) {
>> + mask = 0;
>> + for (j = 0; j < 32; j++) {
>> + feat = feats[i*32 + j];
>> + if (featstat[s, feat]) {
>> + nfstr = fstr " " feat;
>> + if (length(nfstr) > 72) {
>> + printf " * %s\n", fstr;
>> + nfstr = " " feat;
>> + }
>> + fstr = nfstr;
>> + mask += (2 ^ j);
>> + }
>> + }
>> + masks[i] = mask;
>> + }
>> + printf " * %s\n */\n", fstr;
>> +
>> + for (i = 0; i < ncapints; i++)
>> + printf "#define %s_MASK%d\t0x%08xU\n", s, i, masks[i];
>> +
>> + printf "#define %s_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != %d)\n\n", s, ncapints;
>> + }
>> +
>> + printf "#endif /* _ASM_X86_FEATUREMASKS_H */\n";
>> +}
>
>
>
>Building kselftests is regressing with this commit on next-20250303.
>
># make headers
> HOSTCC scripts/basic/fixdep
> HOSTCC scripts/unifdef
> WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h
> WRAP arch/x86/include/generated/uapi/asm/errno.h
> WRAP arch/x86/include/generated/uapi/asm/fcntl.h
> WRAP arch/x86/include/generated/uapi/asm/ioctl.h
> WRAP arch/x86/include/generated/uapi/asm/ioctls.h
> WRAP arch/x86/include/generated/uapi/asm/ipcbuf.h
> WRAP arch/x86/include/generated/uapi/asm/param.h
> WRAP arch/x86/include/generated/uapi/asm/poll.h
> WRAP arch/x86/include/generated/uapi/asm/resource.h
> WRAP arch/x86/include/generated/uapi/asm/socket.h
> WRAP arch/x86/include/generated/uapi/asm/sockios.h
> WRAP arch/x86/include/generated/uapi/asm/termbits.h
> WRAP arch/x86/include/generated/uapi/asm/termios.h
> WRAP arch/x86/include/generated/uapi/asm/types.h
>make[1]: *** No rule to make target '.config', needed by 'arch/x86/include/generated/asm/featuremasks.h'. Stop.
>make: *** [Makefile:251: __sub-make] Error 2
>
>The same used to work fine until next-20250228.
>
>Recreation steps:
>1. Clone next-20250303
>2. make distclean
>3. make headers
>
>Srikanth Aithal <sraithal@amd.com>
"make headers" on an unconfigured tree should presumably only produce the uapi headers, not kernel-internal ones, one could surmise?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-03 12:05 ` H. Peter Anvin
@ 2025-03-03 13:25 ` Borislav Petkov
2025-03-03 22:34 ` H. Peter Anvin
2025-03-04 10:18 ` Xin Li
0 siblings, 2 replies; 16+ messages in thread
From: Borislav Petkov @ 2025-03-03 13:25 UTC (permalink / raw)
To: H. Peter Anvin
Cc: Aithal, Srikanth, Xin Li (Intel), linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On Mon, Mar 03, 2025 at 04:05:54AM -0800, H. Peter Anvin wrote:
> "make headers" on an unconfigured tree should presumably only produce the uapi headers, not kernel-internal ones, one could surmise?
Well, that's kinda a question for you guys:
cfc7686900a87 (H. Peter Anvin (Intel) 2025-02-28 00:23:36 -0800 281)archheaders: $(out)/$(featuremasks_hdr)
1f57d5d85ba7f (Ingo Molnar 2015-06-03 18:36:41 +0200 282) $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
and the headers target has
headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
as its prereq.
Judging by
59b2bd05f5f4 ("kbuild: add 'headers' target to build up uapi headers in usr/include")
it sure looks like "make headers" should be for uapi headers only.
Oh, and it should be documented in "make help" output btw.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-03 13:25 ` Borislav Petkov
@ 2025-03-03 22:34 ` H. Peter Anvin
2025-03-04 10:18 ` Xin Li
1 sibling, 0 replies; 16+ messages in thread
From: H. Peter Anvin @ 2025-03-03 22:34 UTC (permalink / raw)
To: Borislav Petkov
Cc: Aithal, Srikanth, Xin Li (Intel), linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On March 3, 2025 5:25:05 AM PST, Borislav Petkov <bp@alien8.de> wrote:
>On Mon, Mar 03, 2025 at 04:05:54AM -0800, H. Peter Anvin wrote:
>> "make headers" on an unconfigured tree should presumably only produce the uapi headers, not kernel-internal ones, one could surmise?
>
>Well, that's kinda a question for you guys:
>
>cfc7686900a87 (H. Peter Anvin (Intel) 2025-02-28 00:23:36 -0800 281)archheaders: $(out)/$(featuremasks_hdr)
>1f57d5d85ba7f (Ingo Molnar 2015-06-03 18:36:41 +0200 282) $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
>
>and the headers target has
>
>headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
>
>as its prereq.
>
>Judging by
>
>59b2bd05f5f4 ("kbuild: add 'headers' target to build up uapi headers in usr/include")
>
>it sure looks like "make headers" should be for uapi headers only.
>
>Oh, and it should be documented in "make help" output btw.
>
Yes, it was more of a statement. Generating internal headers sans config is utterly bogus.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-03 13:25 ` Borislav Petkov
2025-03-03 22:34 ` H. Peter Anvin
@ 2025-03-04 10:18 ` Xin Li
2025-03-04 10:29 ` Borislav Petkov
1 sibling, 1 reply; 16+ messages in thread
From: Xin Li @ 2025-03-04 10:18 UTC (permalink / raw)
To: Borislav Petkov, H. Peter Anvin
Cc: Aithal, Srikanth, linux-kernel, linux-perf-users, tglx, mingo,
dave.hansen, x86, will, peterz, yury.norov, akpm, acme, namhyung,
brgerst, andrew.cooper3, nik.borisov
On 3/3/2025 5:25 AM, Borislav Petkov wrote:
> On Mon, Mar 03, 2025 at 04:05:54AM -0800, H. Peter Anvin wrote:
>> "make headers" on an unconfigured tree should presumably only produce the uapi headers, not kernel-internal ones, one could surmise?
>
> Well, that's kinda a question for you guys:
>
> cfc7686900a87 (H. Peter Anvin (Intel) 2025-02-28 00:23:36 -0800 281)archheaders: $(out)/$(featuremasks_hdr)
> 1f57d5d85ba7f (Ingo Molnar 2015-06-03 18:36:41 +0200 282) $(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
>
> and the headers target has
>
> headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
>
> as its prereq.
>
> Judging by
>
> 59b2bd05f5f4 ("kbuild: add 'headers' target to build up uapi headers in usr/include")
It seems that 'archprepare' works, however I'm not sure if it's the best
choice. Any suggestion?
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 60583987d320..2db535958b8d 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -276,9 +276,9 @@ $(out)/$(featuremasks_hdr): $(featuremasks_awk)
$(cpufeatures_hdr) $(KCONFIG_CON
$(shell mkdir -p $(out))
$(call if_changed,gen_featuremasks)
-targets += $(out)/$(featuremasks_hdr)
+archprepare: $(out)/$(featuremasks_hdr)
-archheaders: $(out)/$(featuremasks_hdr)
+archheaders:
$(Q)$(MAKE) $(build)=arch/x86/entry/syscalls all
###
>
> it sure looks like "make headers" should be for uapi headers only.
>
> Oh, and it should be documented in "make help" output btw.
Want me to add it btw?
Thanks!
Xin
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-04 10:18 ` Xin Li
@ 2025-03-04 10:29 ` Borislav Petkov
2025-03-05 7:30 ` Xin Li
0 siblings, 1 reply; 16+ messages in thread
From: Borislav Petkov @ 2025-03-04 10:29 UTC (permalink / raw)
To: Xin Li
Cc: H. Peter Anvin, Aithal, Srikanth, linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On Tue, Mar 04, 2025 at 02:18:51AM -0800, Xin Li wrote:
> It seems that 'archprepare' works, however I'm not sure if it's the best
> choice. Any suggestion?
Why do you even need featuremasks_hdr as a prereq?
I still don't get the dependency there.
In any case, you'd have to redo your patches - we've zapped them from tip.
> Want me to add it btw?
Yes pls.
Thx.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-04 10:29 ` Borislav Petkov
@ 2025-03-05 7:30 ` Xin Li
2025-03-05 22:04 ` Borislav Petkov
0 siblings, 1 reply; 16+ messages in thread
From: Xin Li @ 2025-03-05 7:30 UTC (permalink / raw)
To: Borislav Petkov
Cc: H. Peter Anvin, Aithal, Srikanth, linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On 3/4/2025 2:29 AM, Borislav Petkov wrote:
> On Tue, Mar 04, 2025 at 02:18:51AM -0800, Xin Li wrote:
>> It seems that 'archprepare' works, however I'm not sure if it's the best
>> choice. Any suggestion?
>
> Why do you even need featuremasks_hdr as a prereq?
I'm not sure I'm calling it a prereq; it needs to be generated after we
have a build config and before any kernel source file is built.
"perpare" is defined as a post config build target used before starting
building the kernel or the modules, and "archprepare" is used in arch
Makefiles. E.g., on x86, "archprepare" is already used for ORC header
generation:
ifdef CONFIG_UNWINDER_ORC
orc_hash_h := arch/$(SRCARCH)/include/generated/asm/orc_hash.h
orc_hash_sh := $(srctree)/scripts/orc_hash.sh
targets += $(orc_hash_h)
quiet_cmd_orc_hash = GEN $@
cmd_orc_hash = mkdir -p $(dir $@); \
$(CONFIG_SHELL) $(orc_hash_sh) < $< > $@
$(orc_hash_h): $(srctree)/arch/x86/include/asm/orc_types.h
$(orc_hash_sh) FORCE
$(call if_changed,orc_hash)
archprepare: $(orc_hash_h)
endif
>
> In any case, you'd have to redo your patches - we've zapped them from tip.
Sorry for the build noise. Ofc they should be zapped.
BTW, I'm asking if this build check could be added to Intel-LKP.
>
>> Want me to add it btw?
>
> Yes pls.
Sure.
However it needs to change Makefile in the root directory, which is not
maintained in tip, so I will send a separate patch to KERNEL BUILD
maintainers and list. Make sense?
Thanks!
Xin
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-05 7:30 ` Xin Li
@ 2025-03-05 22:04 ` Borislav Petkov
2025-03-22 19:58 ` Xin Li
0 siblings, 1 reply; 16+ messages in thread
From: Borislav Petkov @ 2025-03-05 22:04 UTC (permalink / raw)
To: Xin Li
Cc: H. Peter Anvin, Aithal, Srikanth, linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On Tue, Mar 04, 2025 at 11:30:43PM -0800, Xin Li wrote:
> > Why do you even need featuremasks_hdr as a prereq?
>
> I'm not sure I'm calling it a prereq;
That's what this is called:
https://www.gnu.org/software/make/manual/html_node/Rule-Introduction.html
A prerequisite to a target, latter being "archheaders" in this case.
> Sorry for the build noise. Ofc they should be zapped.
>
> BTW, I'm asking if this build check could be added to Intel-LKP.
Good idea.
> However it needs to change Makefile in the root directory, which is not
> maintained in tip, so I will send a separate patch to KERNEL BUILD
> maintainers and list. Make sense?
Ditto.
Thx.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config
2025-03-05 22:04 ` Borislav Petkov
@ 2025-03-22 19:58 ` Xin Li
0 siblings, 0 replies; 16+ messages in thread
From: Xin Li @ 2025-03-22 19:58 UTC (permalink / raw)
To: Borislav Petkov, philip.li
Cc: H. Peter Anvin, Aithal, Srikanth, linux-kernel, linux-perf-users,
tglx, mingo, dave.hansen, x86, will, peterz, yury.norov, akpm,
acme, namhyung, brgerst, andrew.cooper3, nik.borisov
On 3/5/2025 2:04 PM, Borislav Petkov wrote:
>> Sorry for the build noise. Ofc they should be zapped.
>>
>> BTW, I'm asking if this build check could be added to Intel-LKP.
> Good idea.
FYI, Philip has confirmed that the build check is added to Intel-LKP.
Thanks!
Xin
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-03-22 19:59 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-28 8:23 [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 1/5] x86/cpufeatures: Rename X86_CMPXCHG64 to X86_CX8 Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 2/5] x86/cpufeatures: Add {required,disabled} feature configs Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 3/5] x86/cpufeatures: Generate a feature mask header based on build config Xin Li (Intel)
2025-03-03 11:38 ` Aithal, Srikanth
2025-03-03 12:05 ` H. Peter Anvin
2025-03-03 13:25 ` Borislav Petkov
2025-03-03 22:34 ` H. Peter Anvin
2025-03-04 10:18 ` Xin Li
2025-03-04 10:29 ` Borislav Petkov
2025-03-05 7:30 ` Xin Li
2025-03-05 22:04 ` Borislav Petkov
2025-03-22 19:58 ` Xin Li
2025-02-28 8:23 ` [PATCH v6 4/5] x86/cpufeatures: Remove {disabled,required}-features.h Xin Li (Intel)
2025-02-28 8:23 ` [PATCH v6 5/5] x86/cpufeatures: Use AWK to generate {REQUIRED|DISABLED}_MASK_BIT_SET Xin Li (Intel)
2025-02-28 9:26 ` [PATCH v6 0/5] x86/cpufeatures: Automatically generate required and disabled feature masks Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).