-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/cpufeatures: Generate the <asm/cpufeaturemasks.h> header based on…
… build config Introduce an AWK script to auto-generate the <asm/cpufeaturemasks.h> header with required and disabled feature masks based on <asm/cpufeatures.h> and the 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 ] [ mingo: Improved changelog and comments ] 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> Reviewed-by: Nikolay Borisov <nik.borisov@suse.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20250305184725.3341760-3-xin@zytor.com
- Loading branch information
H. Peter Anvin (Intel)
authored and
Ingo Molnar
committed
Mar 19, 2025
1 parent
3d37d93
commit 8413263
Showing
9 changed files
with
105 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
#!/usr/bin/awk | ||
# | ||
# Convert cpufeatures.h to a list of compile-time masks | ||
# Note: this blithely assumes that each word has at least one | ||
# feature defined in it; if not, something else is wrong! | ||
# | ||
|
||
BEGIN { | ||
printf "#ifndef _ASM_X86_CPUFEATUREMASKS_H\n"; | ||
printf "#define _ASM_X86_CPUFEATUREMASKS_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_CPUFEATUREMASKS_H */\n"; | ||
} |