mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
objtool: Add Function to get the name of a CPU feature
Add a function to get the name of a CPU feature. The function is architecture dependent and currently only implemented for x86. The feature names are automatically generated from the cpufeatures.h include file. Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://patch.msgid.link/20251121095340.464045-27-alexandre.chartre@oracle.com
This commit is contained in:
committed by
Peter Zijlstra
parent
be5ee60ac5
commit
8308fd0019
34
tools/arch/x86/tools/gen-cpu-feature-names-x86.awk
Normal file
34
tools/arch/x86/tools/gen-cpu-feature-names-x86.awk
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/bin/awk -f
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Copyright (c) 2025, Oracle and/or its affiliates.
|
||||
#
|
||||
# Usage: awk -f gen-cpu-feature-names-x86.awk cpufeatures.h > cpu-feature-names.c
|
||||
#
|
||||
|
||||
BEGIN {
|
||||
print "/* cpu feature name array generated from cpufeatures.h */"
|
||||
print "/* Do not change this code. */"
|
||||
print
|
||||
print "static const char *cpu_feature_names[(NCAPINTS+NBUGINTS)*32] = {"
|
||||
|
||||
value_expr = "\\([0-9*+ ]+\\)"
|
||||
}
|
||||
|
||||
/^#define X86_FEATURE_/ {
|
||||
if (match($0, value_expr)) {
|
||||
value = substr($0, RSTART + 1, RLENGTH - 2)
|
||||
print "\t[" value "] = \"" $2 "\","
|
||||
}
|
||||
}
|
||||
|
||||
/^#define X86_BUG_/ {
|
||||
if (match($0, value_expr)) {
|
||||
value = substr($0, RSTART + 1, RLENGTH - 2)
|
||||
print "\t[NCAPINTS*32+(" value ")] = \"" $2 "\","
|
||||
}
|
||||
}
|
||||
|
||||
END {
|
||||
print "};"
|
||||
}
|
||||
1
tools/objtool/.gitignore
vendored
1
tools/objtool/.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
arch/x86/lib/cpu-feature-names.c
|
||||
arch/x86/lib/inat-tables.c
|
||||
/objtool
|
||||
feature
|
||||
|
||||
@@ -125,6 +125,7 @@ $(LIBSUBCMD)-clean:
|
||||
clean: $(LIBSUBCMD)-clean
|
||||
$(call QUIET_CLEAN, objtool) $(RM) $(OBJTOOL)
|
||||
$(Q)find $(OUTPUT) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
||||
$(Q)$(RM) $(OUTPUT)arch/x86/lib/cpu-feature-names.c $(OUTPUT)fixdep
|
||||
$(Q)$(RM) $(OUTPUT)arch/x86/lib/inat-tables.c $(OUTPUT)fixdep
|
||||
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.objtool
|
||||
$(Q)$(RM) -r -- $(OUTPUT)feature
|
||||
|
||||
@@ -194,3 +194,8 @@ struct reloc *arch_find_switch_table(struct objtool_file *file,
|
||||
|
||||
return rodata_reloc;
|
||||
}
|
||||
|
||||
const char *arch_cpu_feature_name(int feature_number)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -18,3 +18,8 @@ struct reloc *arch_find_switch_table(struct objtool_file *file,
|
||||
{
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
const char *arch_cpu_feature_name(int feature_number)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
objtool-y += special.o
|
||||
objtool-y += decode.o
|
||||
objtool-y += special.o
|
||||
objtool-y += orc.o
|
||||
|
||||
inat_tables_script = ../arch/x86/tools/gen-insn-attr-x86.awk
|
||||
@@ -12,3 +12,14 @@ $(OUTPUT)arch/x86/lib/inat-tables.c: $(inat_tables_script) $(inat_tables_maps)
|
||||
$(OUTPUT)arch/x86/decode.o: $(OUTPUT)arch/x86/lib/inat-tables.c
|
||||
|
||||
CFLAGS_decode.o += -I$(OUTPUT)arch/x86/lib
|
||||
|
||||
cpu_features = ../arch/x86/include/asm/cpufeatures.h
|
||||
cpu_features_script = ../arch/x86/tools/gen-cpu-feature-names-x86.awk
|
||||
|
||||
$(OUTPUT)arch/x86/lib/cpu-feature-names.c: $(cpu_features_script) $(cpu_features)
|
||||
$(call rule_mkdir)
|
||||
$(Q)$(call echo-cmd,gen)$(AWK) -f $(cpu_features_script) $(cpu_features) > $@
|
||||
|
||||
$(OUTPUT)arch/x86/special.o: $(OUTPUT)arch/x86/lib/cpu-feature-names.c
|
||||
|
||||
CFLAGS_special.o += -I$(OUTPUT)arch/x86/lib
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#include <objtool/special.h>
|
||||
#include <objtool/builtin.h>
|
||||
#include <objtool/warn.h>
|
||||
#include <asm/cpufeatures.h>
|
||||
|
||||
/* cpu feature name array generated from cpufeatures.h */
|
||||
#include "cpu-feature-names.c"
|
||||
|
||||
void arch_handle_alternative(struct special_alt *alt)
|
||||
{
|
||||
@@ -134,3 +138,9 @@ struct reloc *arch_find_switch_table(struct objtool_file *file,
|
||||
*table_size = 0;
|
||||
return rodata_reloc;
|
||||
}
|
||||
|
||||
const char *arch_cpu_feature_name(int feature_number)
|
||||
{
|
||||
return (feature_number < ARRAY_SIZE(cpu_feature_names)) ?
|
||||
cpu_feature_names[feature_number] : NULL;
|
||||
}
|
||||
|
||||
@@ -38,4 +38,6 @@ bool arch_support_alt_relocation(struct special_alt *special_alt,
|
||||
struct reloc *arch_find_switch_table(struct objtool_file *file,
|
||||
struct instruction *insn,
|
||||
unsigned long *table_size);
|
||||
const char *arch_cpu_feature_name(int feature_number);
|
||||
|
||||
#endif /* _SPECIAL_H */
|
||||
|
||||
Reference in New Issue
Block a user